Python 3.6 Pandas匹配两列值并返回索引位置列表的问题
解决Pandas生成匹配索引列表列的问题
问题回顾
你已经成功创建了match列标记column1的值是否存在于column2中,但在尝试生成存储匹配索引的indices列时,遇到了ValueError: Length of values does not match length of index的错误,期望得到每行对应column1值在column2中所有匹配索引的列表(或逗号分隔字符串)。
错误原因分析
你之前尝试的列表推导式逻辑有误:
data_df['indices'] = [i for i, x in enumerate(data_df['column2']) if x == np.where((data_df.column1.isin(data_df['column2'])))]
这个推导式会生成所有匹配的索引组成的单个大列表,而不是为每行column1值生成对应的索引列表,导致结果长度和DataFrame的行数(5行)不匹配,触发了长度错误。
解决方案
我们可以先构建一个column2值到对应索引列表的映射字典,再快速匹配每行的column1值,这样既高效又能满足需求:
完整代码示例
import pandas as pd import numpy as np # 初始化数据集 data = [ {'column1': 'ibm', 'column2': 'apple'}, {'column1': 'microsoft', 'column2': 'ibm'}, {'column1': 'apple', 'column2': 'ibm'}, {'column1': 'apple', 'column2': 'microsoft'}, {'column1': 'yahoo', 'column2': 'microsoft'} ] data_df = pd.DataFrame(data) # 创建match列(你的原有代码,保持不变) data_df['match'] = np.where(data_df.column1.isin(data_df['column2']), 1, 0) # 构建column2值到索引列表的映射字典 value_to_indices = data_df['column2'].reset_index().groupby('column2')['index'].apply(list).to_dict() # 生成indices列:将索引列表转为逗号分隔字符串,无匹配则为NaN data_df['indices'] = data_df['column1'].map(value_to_indices).apply( lambda x: ','.join(map(str, x)) if isinstance(x, list) else np.nan ) print(data_df)
运行结果
column1 column2 match indices 0 ibm apple 1 1,2 1 microsoft ibm 1 3,4 2 apple ibm 1 0 3 apple microsoft 1 0 4 yahoo microsoft 0 NaN
完全符合你期望的结果!
可选调整:保留列表格式
如果你希望indices列存储的是列表而非字符串,只需修改最后一步:
data_df['indices'] = data_df['column1'].map(value_to_indices)
此时indices列的内容会是列表(如[1,2]、[0]),无匹配时为NaN。
方案优势
- 高效性:提前构建映射字典,避免每行都遍历整个
column2,处理大数据集时性能更优; - 准确性:确保每行的
column1值对应正确的索引列表,不会出现长度不匹配的问题; - 灵活性:可根据需求选择存储列表或逗号分隔的字符串。
内容的提问来源于stack exchange,提问作者Carter Rees
相关产品推荐
相关产品推荐

