
本文详解如何将多个具有相同索引结构(如日期)的 pandas dataframe 中某一列的值,按索引对齐后合并为单个 dataframe 的一列,并以逗号分隔字符串形式呈现。
本文详解如何将多个具有相同索引结构(如日期)的 pandas dataframe 中某一列的值,按索引对齐后合并为单个 dataframe 的一列,并以逗号分隔字符串形式呈现。
在实际数据分析中,我们常遇到多个来源的时序数据(如不同商品的日销量、不同传感器的采样记录),它们共享时间索引但分布在不同 DataFrame 中。目标是将这些分散的观测值按时间点“归并”——即对每个日期,聚合所有对应项(如 apple、orange、banana),并用逗号连接成单一字符串。这本质上是一个基于索引的垂直拼接 + 分组聚合操作。
核心思路分三步:
- 纵向拼接(pd.concat):将多个 DataFrame 沿行方向堆叠,保留原始索引;
- 按索引分组(groupby(level=0)):level=0 表示按最外层索引(即日期)分组;
- 聚合拼接(agg(lambda x: ",".join(x))):对每组内该列的所有值执行字符串连接。
以下是完整可运行代码示例:
import pandas as pd
# 构建示例数据
s1 = pd.DataFrame({'item': ['apple', 'apple', 'apple']},
index=['1/2/2024', '1/5/2024', '1/6/2024'])
s2 = pd.DataFrame({'item': ['orange', 'orange', 'orange']},
index=['1/3/2024', '1/5/2024', '1/7/2024'])
s3 = pd.DataFrame({'item': ['banana', 'banana', 'banana', 'banana']},
index=['1/4/2024', '1/5/2024', '1/6/2024', '1/7/2024'])
# 三步合一:拼接 → 按索引分组 → 合并字符串
result = pd.concat([s1, s2, s3]).groupby(level=0).agg(lambda x: ",".join(x))
print(result)输出结果完全符合预期:
item 1/2/2024 apple 1/3/2024 orange 1/4/2024 banana 1/5/2024 apple,orange,banana 1/6/2024 apple,banana 1/7/2024 orange,banana
✅ 关键注意事项:
- 确保所有 DataFrame 的索引类型一致(如均为 str 或已转为 pd.DatetimeIndex),否则 groupby 可能因隐式类型转换导致意外分组;
- 若存在缺失值(NaN),",".join() 会报错,建议提前清洗:lambda x: ",".join(x.dropna().astype(str));
- 如需保持原始索引顺序(如按日期升序),可在最后添加 .sort_index();
- 若列名不统一(如 s1 是 'item',s2 是 'product'),需先重命名:s2.rename(columns={'product': 'item'})。
该方法简洁高效,时间复杂度为 O(n),适用于数百至百万级行数场景。掌握此模式,你便能灵活处理多源时序标签聚合、事件归并、多渠道用户行为汇总等典型任务。

















