pandas:检查列表数组中的成员资格,避免循环遍历列

时间:2014-08-31 13:48:15

标签: python pandas

完成以下任务的最佳方法是什么?

在以下DataFrame中,

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 [' b']列中包含的列df [' a']中的唯一元素,因此该列表对应于元素' ý'在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)

但是很慢。

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为这是一个为什么你不想在Pandas DataFrame中有一列列表的例子。访问列表中的值会强制您使用Python循环而无法真正利用Pandas。

理想情况下,我认为您最好改变构建df的方式,这样就不会将值存储在b列表中。要使用的适当数据结构取决于您打算如何使用数据。

对于您在问题中描述的特定目的,dict会很有用。

要构建当前df的dict,您可以这样做:

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