完成以下任务的最佳方式是什么?
在下面的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