如何在Pandas DataFrame中根据列表元素索引匹配对应列值?
Pandas根据列表索引匹配对应元素的实现方法
首先构造示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'col_a': ['hello'], 'col_b': [['goodbye', 'how are you', 'hello']], 'col_c': [['farewell', 'question', 'greeting']] })
方法一:逐行处理(直观易懂)
使用apply遍历每一行,先获取col_a值在col_b列表中的索引,再用该索引提取col_c对应元素:
df['result'] = df.apply(lambda row: row['col_c'][row['col_b'].index(row['col_a'])], axis=1)
如果需要处理col_a不在col_b中的异常情况,可自定义函数捕获错误:
def get_matching_element(row): try: idx = row['col_b'].index(row['col_a']) return row['col_c'][idx] except ValueError: return pd.NA # 也可返回None或其他默认值 df['result'] = df.apply(get_matching_element, axis=1)
方法二:矢量化处理(高效适合大数据集)
当数据量较大时,apply的逐行遍历效率偏低,可通过explode展开列表后匹配:
# 展开col_b和col_c列表,保留原行索引 exploded_df = df.explode(['col_b', 'col_c'], ignore_index=False) # 筛选col_a与col_b值相等的行,提取对应col_c matched_result = exploded_df[exploded_df['col_a'] == exploded_df['col_b']]['col_c'] # 将结果合并回原DataFrame df = df.join(matched_result.rename('result'))
运行后,df['result']列即为所需的匹配元素,示例中结果为'greeting'。
内容的提问来源于stack exchange,提问作者VladKhol
相关产品推荐
相关产品推荐

