2014-08-31 103 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