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’]列的元素"y",


我试过了:

def match(item):
    for ind, row in A.iterrows():
        if item in row.b:
            return row.c
    return False
df['a'].apply(match)

但速度相当慢。

谢谢!

我认为这就是为什么您永远不希望在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

最新更新