如何基于参考列在Python Pandas中合并多行数据?
基于Pandas按日期列合并多行描述内容
问题场景
现有如下Pandas DataFrame:
0 1 2 3 4 0 Date Description ABC DEF 1 LOREM ISPUM 1234.00 2 01/08 LOREM IPSUM LOREM IPSUM 12.34 3 ABCDEF ABCDEF ACBDEF 4 01/08 DOLOR SIT AMET 56.78 5 CONSECTETUR ADIPISCING ELIT 6 SED DO EIUSMOD TEMPOR 7 07/08 LOREM ISPUM 90.12 8 08/08 DOLOR SIT AMET 34.56
其中部分行的Description列(第1列)内容被拆分到多行(比如第2-3行、第4-5-6行),需要基于Date列(第0列)将这些多行内容合并为单行,同时满足:
- 表头之后,若某行Date为空则暂不合并,直到遇到非空Date行(比如第1行保持原样)
- 最终输出如下:
0 1 2 3 4 0 Date Description ABC DEF 1 LOREM ISPUM 1234.00 2 01/08 LOREM IPSUM LOREM IPSUM ABCDEF ABCDEF ACBDEF 12.34 3 01/08 DOLOR SIT AMET CONSECTETUR ADIPISCING ELIT SED DO EIUSMOD TEMPOR 56.78 4 07/08 LOREM ISPUM 90.12 5 08/08 DOLOR SIT AMET 34.56
解决方案
可以通过以下步骤实现:
- 分离表头和数据行,单独处理数据部分
- 为数据行创建分组标识:非空Date行为分组起点,后续空Date行归属于上一个非空Date的分组;无前置非空Date的空行单独成组
- 对每个分组聚合:合并
Description列的所有内容,其他列保留分组内的第一个非空值 - 合并表头和处理后的数据行
具体代码实现:
import pandas as pd import numpy as np # 构造原始DataFrame(模拟输入) df = pd.DataFrame([ ['Date', 'Description', '', 'ABC', 'DEF'], ['', 'LOREM ISPUM', '', '', '1234.00'], ['01/08', 'LOREM IPSUM LOREM IPSUM', '', '12.34', ''], ['', 'ABCDEF ABCDEF ACBDEF', '', '', ''], ['01/08', 'DOLOR SIT AMET', '', '56.78', ''], ['', 'CONSECTETUR ADIPISCING ELIT', '', '', ''], ['', 'SED DO EIUSMOD TEMPOR', '', '', ''], ['07/08', 'LOREM ISPUM', '', '90.12', ''], ['08/08', 'DOLOR SIT AMET', '', '', '34.56'] ], columns=[0,1,2,3,4]) # 分离表头和数据行 header = df.iloc[[0]] data = df.iloc[1:] # 生成分组标记:空Date行继承上一个非空Date的标记,首行无前置非空Date则单独标记 data['group'] = data[0].replace('', np.nan).ffill() data['group'] = np.where(data['group'].isna(), 'single_row', data['group']) # 定义聚合规则 agg_rules = { 0: lambda x: x.dropna().iloc[0] if not x.dropna().empty else '', 1: lambda x: ' '.join(x.dropna().astype(str)), 2: lambda x: x.dropna().iloc[0] if not x.dropna().empty else '', 3: lambda x: x.dropna().iloc[0] if not x.dropna().empty else '', 4: lambda x: x.dropna().iloc[0] if not x.dropna().empty else '' } # 分组聚合处理 merged_data = data.groupby('group', sort=False).agg(agg_rules).reset_index(drop=True) # 合并表头与处理后的数据 final_result = pd.concat([header, merged_data], ignore_index=True) # 打印结果 print(final_result.to_string(index=False))
关键逻辑说明
- 分组标记:用
ffill()实现空Date行的分组继承,确保后续多行描述能归属到对应的日期组;首行空Date单独标记,避免被错误合并 - 聚合规则:
Description列拼接所有非空内容,其他列保留分组内的第一个有效数据,保证原始数值信息不丢失
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

