2013-07-11 41 views
1

我有一個熊貓數據框加上一串熊貓系列標識符,並且希望過濾來自數據框中與該系列標識符對應的行。要從數據框中獲取標識符,我需要連接其前兩列。我已經嘗試過各種各樣的東西來過濾,但似乎沒有工作到目前爲止。這裏是我曾嘗試過的:使用連接字符串過濾來自熊貓數據框的行

1)我試着在數據框中添加一列布爾值,如果該行對應於其中一個標識符,則返回true,否則返回false(希望能夠使用後面的過濾新的列):

df["isInAcids"] = (df["AcNo"] + df["Sortcode"]) in acids 

其中

acids 

是包含標識符系列。

然而,這給我一個

TypeError: unhashable type 

2)我嘗試使用應用功能過濾:

df[df.apply(lambda x: x["AcNo"] + x["Sortcode"] in acids, axis = 1)] 

這不會給我一個錯誤,但是該數據幀的長度保持不變,所以它不會過濾任何東西。

3)我添加了一個新列,包含連接的字符串/標識符,然後嘗試之後過濾(見Filter dataframe rows if value in column is in a set list of values):

df["ACIDS"] = df["AcNo"] + df["Sortcode"] 
df[df["ACIDS"].isin(acids)] 

但同樣,數據幀不會改變。

我希望這是有道理的......

,我可能會錯誤有什麼建議? 謝謝, 安妮

+1

你可以發佈你的'dataframe'和'series'的一個小樣本,你期望你的結果看起來像什麼嗎? – TomAugspurger

+0

這些操作不在原位,所以數據框不會只是改變,除非你明確地告訴它(這是一個**好的事情)。 –

+0

嗨安迪,非常感謝,如果我在第三個解決方案中添加'df = ...'。 – Anne

回答

3

我想你問的東西,像下面這樣:

In [1]: other_ids = pd.Series(['a', 'b', 'c', 'c']) 

In [2]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'c', 'f']}) 

In [3]: df 
Out[3]: 
    ids vals 
0 a  1 
1 b  2 
2 c  3 
3 f  4 

In [4]: other_ids 
Out[4]: 
0 a 
1 b 
2 c 
3 c 
dtype: object 

在這種情況下,該系列other_ids會像你的系列acids。我們只想選擇其中idother_ids系列中的那些行df。爲此,我們將使用dataframe的方法.isin()

In [5]: df.ids.isin(other_ids) 
Out[5]: 
0  True 
1  True 
2  True 
3 False 
Name: ids, dtype: bool 

這給布爾變量的一列,我們可以索引:

In [6]: df[df.ids.isin(other_ids)] 
Out[6]: 
    ids vals 
0 a  1 
1 b  2 
2 c  3 

這是接近你與你的第三次嘗試做的事情。一旦你發佈了你的數據框樣本,我可以編輯這個答案,如果它沒有工作。

再多讀一點,您可能會遇到麻煩,因爲您有兩個列,即df,這兩列是您的ID號?Dataframe不具有isin方法,但我們可以避開與類似:

In [26]: df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': ['a', 'b', 'f', 'f'], 
'ids2': ['e', 'f', 'c', 'f']}) 

In [27]: df 
Out[27]: 
    ids ids2 vals 
0 a e  1 
1 b f  2 
2 f c  3 
3 f f  4 

In [28]: df.ids.isin(ids) + df.ids2.isin(ids) 
Out[28]: 
0  True 
1  True 
2  True 
3 False 
dtype: bool 

True就像1 False就像是零,所以我們從兩個isins()添加兩個布爾系列要達到這樣的一個OR操作。然後像以前一樣,我們可以索引到這個布爾系列:

In [29]: new = df.ix[df.ids.isin(ids) + df.ids2.isin(ids)] 

In [30]: new 
Out[30]: 
    ids ids2 vals 
0 a e  1 
1 b f  2 
2 f c  3 
+0

我認爲這個問題的主要困惑是這些操作不在原地(即你需要設置'df = df [df.ids.isin(other_ids)]') –

+0

我認爲這是正確的。另一個問題*可能是她有兩列'ids',我有一個。有沒有一個原因,'dataframe'沒有'isin()'方法,有些選項比如'或'和'和'? – TomAugspurger

+0

那應該是好的。我認爲做或者之後的做法會更有效率,所以大熊貓會採取行政決定,您應該這樣做。 –