2014-09-21 64 views
0

我有以下數據幀大熊貓 - 選擇行如果行[i]爲行[J]爲數據幀

id B C D 
1 1 1 [1,2,3] 
2 2 1 [1,2,3] 
3 0 1 [1,2,3] 
4 1 1 [0,1] 
5 2 1 [0,1] 

每一行的列D是一個列表。我怎樣才能選擇行來形成一個新的數據框,以便每一行滿足:B in D = True

例如,上面DF的結果將變成:

id B C D 
1 1 1 [1,2,3] 
2 2 1 [1,2,3] 
4 1 1 [0,1] 

我試着用df[df['B'] in df['D']],它給我的錯誤:TypeError: 'Series' objects are mutable, thus they cannot be hashed

+0

爲了避免混淆和浪費人們的時間,你應該真正發佈完整和正確的問題要求。 – EdChum 2014-09-21 14:36:33

+0

@EdChum是的,我應該有。謝謝你的回答,併爲此感到抱歉。下次會更加小心。 – Yulong 2014-09-21 15:34:50

回答

2

您可以使用apply檢查每個行是否滿足條件,並使用所產生的布爾系列做切片:

import pandas as pd 
df = pd.DataFrame({'id':[1,2,3,4,5], 'B':[1,2,0,1,2], 'C' : [1,1,1,1,1], 'D':[[1,2,3], [1,2,3], [1,2,3], [0,1],[0,1]]}) 
print df[df.apply(lambda x: x['B'] in x['D'], axis=1)] 

輸出:

B C   D id 
0 1 1 [1, 2, 3] 1 
1 2 1 [1, 2, 3] 2 
3 1 1  [0, 1] 4 

這是基於以下假設:列D在行之間是不相同的;否則,應優先採用基於isin的解決方案,因爲它更高效。

+0

謝謝! 「應用」就是這樣做的。 – Yulong 2014-09-21 15:35:07