如何将Pandas DataFrame中列表列元素与同表另一列进行比对
Pandas 新增标记列:检查值是否存在于对应行的列表中
现有一个Pandas DataFrame,所有列的数据类型均为object。需求是:遍历每行的column_1(存储列表),检查column_2的值是否存在于该行的column_1列表中,新增flag列标记结果(存在为True,不存在为False)。
原DataFrame结构
| column_1 | column_2 |
|---|---|
| [value_1,value_2,value_3] | value_2 |
| [value_1,value_2,value_3] | value_3 |
| [value_1,value_2,value_3] | value_7 |
期望结果
| column_1 | column_2 | flag |
|---|---|---|
| [value_1,value_2,value_3] | value_2 | True |
| [value_1,value_2,value_3] | value_3 | True |
| [value_1,value_2,value_3] | value_7 | False |
解决方案
方法1:使用apply + lambda表达式
这是最直观的实现方式,按行遍历检查:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'column_1': [['value_1', 'value_2', 'value_3'], ['value_1', 'value_2', 'value_3'], ['value_1', 'value_2', 'value_3']], 'column_2': ['value_2', 'value_3', 'value_7'] }) # 生成flag列 df['flag'] = df.apply(lambda row: row['column_2'] in row['column_1'], axis=1)
方法2:列表推导式(更高效)
如果处理大数据量,列表推导式的执行效率远高于apply:
df['flag'] = [col2_val in col1_list for col1_list, col2_val in zip(df['column_1'], df['column_2'])]
特殊情况处理:column_1是字符串形式的列表
如果column_1存储的是字符串(比如"[value_1,value_2,value_3]"),需要先将其解析为实际列表:
import ast # 解析字符串为列表 df['column_1'] = df['column_1'].apply(ast.literal_eval) # 再生成flag列 df['flag'] = [col2_val in col1_list for col1_list, col2_val in zip(df['column_1'], df['column_2'])]
内容的提问来源于stack exchange,提问作者Juan Almada
相关产品推荐
相关产品推荐

