如何在Pandas DataFrame中按C2/C3非空分组合并C4列多行内容?
解决方法
可以通过分组标识+聚合的方式高效实现需求,步骤如下:
1. 构造测试数据
先将示例数据转换为Pandas DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'C1': [2021, 2021, 2021, 2021, 2021], 'C2': [4, np.nan, np.nan, 5, np.nan], 'C3': ['1X', np.nan, np.nan, '1Y', np.nan], 'C4': ['"First text "', '"continued"', '"still Continued"', '"second text"', '"continued"'] })
2. 创建分组标识
通过判断C2和C3是否同时非空,生成分组编号,后续属于同一组的行会被归为同一个编号:
# 当C2和C3都不为空时标记为新分组起点,累计求和得到分组ID df['group_id'] = df[['C2', 'C3']].notna().all(axis=1).cumsum()
3. 分组聚合合并
对每个分组,提取C1/C2/C3的首个非空值,同时合并C4的所有文本(先去掉引号、清理多余空格):
result = df.groupby('group_id').agg( C1=('C1', 'first'), C2=('C2', 'first'), C3=('C3', 'first'), C4=('C4', lambda x: ' '.join([s.strip('"').strip() for s in x])) ).reset_index(drop=True)
执行后得到的result就是目标结果:
C1 C2 C3 C4 0 2021 4.0 1X First text continued still Continued 1 2021 5.0 1Y second text continued
关键说明
- 分组逻辑:只有当
C2和C3同时非空时才开启新分组,确保后续空值行都归属于上一个有效组。 - 文本处理:通过
strip('"').strip()去掉引号和首尾空格,再用join合并,避免出现多余空格。
内容的提问来源于stack exchange,提问作者user3503711
相关产品推荐
相关产品推荐

