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

如何基于参考列在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:06:30