2014-08-31 104 views
0

完成以下任務的最佳方法是什麼?pandas:檢查列表數組中的成員資格,避免循環遍歷列

在以下的數據幀,

df = DataFrame({'a':[20,21,99], 'b':[[1,2,3,4],[1,2,99],[1,2]], 'c':['x','y','z']}) 

我想檢查哪些元素在列DF [ 'A']是包含在柱DF [ 'B']一些列表。如果有匹配我想在列DF [「C」]對應的元素,如果沒有找到匹配0。

所以在我的例子,我想獲得一個系列:

[0,0,'y']. 

由於99是在列DF的唯一元件[「一」]包含在從柱DF [「b」]的列表,並且該列表對應於元件的「y」在列DF [「C」]


我試過了:

def match(item): 
    for ind, row in A.iterrows(): 
     if item in row.b: 
      return row.c 
    return False 

df['a'].apply(match) 

但速度很慢。

謝謝!

回答

3

我認爲這是一個例子,說明爲什麼你永遠不需要在Pandas DataFrame中列出一列。訪問列表中的值會迫使您使用Python循環,而沒有機會真正利用Pandas。

理想情況下,我認爲您最好改變您構建df的方式,這樣您就不會將值存儲在b列表中。要使用適當的數據結構取決於您打算如何使用數據。

爲了您在問題中描述的特定目的,dict將會很有用。

爲構建字典鑑於目前df,你可以這樣做:

In [69]: dct = {key:row['c'] for i, row in df[['b', 'c']].iterrows() for key in row['b']} 

In [70]: df['a'].map(dct).fillna(0) 
Out[70]: 
0 0 
1 0 
2 y 
Name: a, dtype: object