Pandas:如何判断单列值是否在对应行的列表列中(不展开列表)
解决DataFrame逐行判断值是否在对应行列表中的问题
你的代码df.loc[df['value'].isin(df['column_of_lists']), 'is_in_column_of_lists'] = True之所以全返回False,是因为isin()的逻辑是检查value列的每个元素是否等于column_of_lists列中的某个列表对象,而非判断该值是否在对应行的列表内部。
下面是几种符合你需求(不展开列表列)的正确解法:
方法1:用apply逐行判断(直观易读)
通过apply遍历每一行,直接判断当前行的value是否存在于对应行的列表中:
import pandas as pd # 构造示例数据 data = { 'value': [1, 3, 1, 3], 'column_of_lists': [[1,2,1,1], [3], [4,4], [0]] } df = pd.DataFrame(data) # 生成结果列 df['is_in_column_of_lists'] = df.apply(lambda row: row['value'] in row['column_of_lists'], axis=1)
运行后得到的结果:
| value | column_of_lists | is_in_column_of_lists |
|---|---|---|
| 1 | [1,2,1,1] | True |
| 3 | [3] | True |
| 1 | [4,4] | False |
| 3 | [0] | False |
方法2:用列表推导式(性能更优)
列表推导式在处理小到中等规模数据时,比apply的执行速度更快:
df['is_in_column_of_lists'] = [v in lst for v, lst in zip(df['value'], df['column_of_lists'])]
补充:大数据量场景(可选,会临时展开列表)
如果你的数据集规模很大,上述方法效率不足,可以先临时展开列表再分组判断(虽然会生成临时多列,但性能更优):
temp_df = df.explode('column_of_lists') temp_df['match'] = temp_df['value'] == temp_df['column_of_lists'] df['is_in_column_of_lists'] = temp_df.groupby(level=0)['match'].any()
内容的提问来源于stack exchange,提问作者Woys
相关产品推荐
相关产品推荐

