如何用Pandas查找多列间重复值并关联对应日期列?
解决Pandas中跨列重复值的匹配与整理问题
原始数据
你提供的原始DataFrame如下:
X | 10/02/2023 | 11/02/2023 | 12/02/2023 | 0 | 4328 | 4579 | 8531 | 1 | 4578 | 4328 | 9205 | 2 | 8531 | 5698 | 7147 |
需求
找出在多日期列中重复出现的数值,并整理为「数值 + 对应出现的日期」的格式,期望结果如下:
X | Process | Date1 | Date2 | 0 | 4328 | 10/02/2023 | 11/02/2023 | 1 | 8531 | 10/02/2023 | 12/02/2023 |
解决方案
可以通过长格式转换 + 分组聚合的方式实现,步骤如下:
- 先将宽格式数据转为长格式,让每个数值和对应日期成为单独行:
import pandas as pd # 构建原始DataFrame df = pd.DataFrame({ 'X': [0, 1, 2], '10/02/2023': [4328, 4578, 8531], '11/02/2023': [4579, 4328, 5698], '12/02/2023': [8531, 9205, 7147] }) # 转换为长格式 melted_df = df.melt(id_vars='X', var_name='Date', value_name='Value')
- 按数值分组,收集每个数值对应的所有日期,过滤仅出现一次的数值:
# 分组聚合,获取每个数值的日期列表 value_date_map = melted_df.groupby('Value')['Date'].apply(list).reset_index() # 筛选出出现次数≥2的数值 filtered = value_date_map[value_date_map['Date'].str.len() >= 2]
- 将日期列表拆分为独立列,调整列名和顺序得到最终结果:
# 将日期列表拆分为多列 filtered[['Date1', 'Date2']] = pd.DataFrame(filtered['Date'].tolist(), index=filtered.index) # 整理列结构匹配期望格式 final_df = filtered.rename(columns={'Value': 'Process'}).drop('Date', axis=1) final_df['X'] = final_df.index final_df = final_df[['X', 'Process', 'Date1', 'Date2']] print(final_df)
输出结果
运行代码后将得到:
X Process Date1 Date2 0 0 4328 10/02/2023 11/02/2023 1 1 8531 10/02/2023 12/02/2023
如果后续有数值出现在3列及以上的情况,只需调整拆分列的逻辑(比如循环生成Date3、Date4等)即可适配。
内容的提问来源于stack exchange,提问作者Renan Oliveira
相关产品推荐
相关产品推荐

