python - 将列表列与第二个列表进行比较并返回第三个列表中的项目

标签 python pandas list

有一个带有列表列和两个引用列表的数据框:

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'] = ''

这会打印出我的预期,但不会改变实际值,我没有大量数据可以迭代,但也不确定是否有更优雅的方法。列表列中只会有一个匹配项,不会有多个选项。

最佳答案

您可以使用 explodemapgroupby + 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/

相关文章:

python - 更改 distutils 使用的 gcc 版本

python - 合并缺少键的字典以创建组合字典

python - 查找每行具有最大值的列名

python - 根据现有列中的条件在数据框中创建新列

python - 继承QAbstrctitemModel、PyQt时使用Lists作为QModelIndex中的internalPointer

python - 如果日期不是工作日,Pandas 会将 DatetimeIndex 偏移到下一个营业日

Python APScheduler 删除作业后抛出异常

python - 从 Pandas 列中取出最低和最高日期

python - 将 3 堆数字从左到右逐行排序

r - 如何获取列表中每个元素的最后一个子元素?