完成以下任务的最佳方法是什么?
在以下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)
但是很慢。
谢谢!
答案 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