有一个带有列表列和两个引用列表的数据框:
d = {'col1': [1,2,3,4,5], 'col2':[['a','b'],['a','b'],['a','b','c'],['a','b','d'], ['a','b','e']]}
df = pd.DataFrame(data=d)
ref_a = ['c','d','e','f']
ref_b = ['option1', 'option2', 'option3', 'option4']
col1 col2
0 1 [a, b]
1 2 [a, b]
2 3 [a, b, c]
3 4 [a, b, d]
4 5 [a, b, e]
我想创建第三列,检查 col2 中的值是否在 ref_a 中,并返回 ref_b 中的匹配项
col1 col2 check
0 1 [a, b]
1 2 [a, b]
2 3 [a, b, c] option1
3 4 [a, b, d] option2
4 5 [a, b, e] option3
我尝试过这样的事情:
for index, row in df.iterrows():
for (a, b) in zip(ref_a, ref_b):
if a in row['col2']:
df.loc[index, 'check'] = b
print('true', b)
else:
df.loc[index, 'check'] = ''
这会打印出我的预期,但不会改变实际值,我没有大量数据可以迭代,但也不确定是否有更优雅的方法。列表列中只会有一个匹配项,不会有多个选项。
最佳答案
您可以使用 explode
、map
和 groupby
+ first
的组合来获得不错的效果(并且可能相当快) Pandas 式的一句台词:
df['check'] = df['col2'].explode().map(dict(zip(ref_a, ref_b))).groupby(level=0).first().fillna('')
输出:
>>> df
col1 col2 check
0 1 [a, b]
1 2 [a, b]
2 3 [a, b, c] option1
3 4 [a, b, d] option2
4 5 [a, b, e] option3
关于python - 将列表列与第二个列表进行比较并返回第三个列表中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71026051/