You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

方案优势

  1. 高效性:提前构建映射字典,避免每行都遍历整个column2,处理大数据集时性能更优;
  2. 准确性:确保每行的column1值对应正确的索引列表,不会出现长度不匹配的问题;
  3. 灵活性:可根据需求选择存储列表或逗号分隔的字符串。

内容的提问来源于stack exchange,提问作者Carter Rees

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:31:39