如何在Pandas中汇总非全列有数据的行并新增汇总行?
合并不完整行生成完整记录
我在项目中经常遇到如下格式的DataFrame,需要将这些列未全有数据的行合并为完整行后插入SQL数据库。**注意:**空单元格的间距不固定。
| 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|
| 108.864 | INTERCAMBIADORES DE | 1123.60 210.08 166.71 1333.68 | ||
| CALOR 8419500300 | ||||
| 147.420 5.000 | PZ | 1A0181810000 | 81039.25 15149.52 19237.754880 96188.77 | |
| 147.420 | INTERCAMBIADORES DE | 3882.25 725.75 921.60 4608.00 | ||
| CALOR 8419500300 | ||||
| 566.093 12.000 | PZ | 1A0183660000 | 66187.40 12374.29 6546.806709 78561.68 | |
| 566.093 | INTERCAMBIADORES DE | 3170.76 592.80 313.63 3763.56 | ||
| CALOR 8419500300 | ||||
| 3.645 1.000 | PZ | 1A0185890000 | 836.64 159.69 996.330339 996.33 | |
| 3.645 | INTERCAMBIADORES DE | 40.08 7.65 47.73 47.73 | ||
| CALOR 8419500300 | ||||
| 131.998 3.000 | PZ | 1A0190390000 | 32819.41 6135.17 12984.858315 38954.57 | |
| 131.998 | INTERCAMBIADORES DE | 1572.24 293.91 622.05 1866.15 | ||
| CALOR 8419500300 | ||||
| 123.833 3.000 | PZ | 1A0190790000 | 54769.36 10238.84 21669.402087 65008.21 | |
| 123.833 | INTERCAMBIADORES DE | 2623.77 490.50 1038.09 3114.27 | ||
| CALOR 8419500300 | ||||
| 115.214 2.000 | PZ | 1A0195920000 | 54642.66 10215.05 32428.851279 64857.70 | |
| 115.214 | INTERCAMBIADORES DE | 2617.70 489.36 1553.53 3107.06 |
解决方案
使用Pandas可以快速合并这些不完整行,步骤如下:
代码实现
import pandas as pd import numpy as np # 示例DataFrame(实际场景可替换为读取你的数据源) data = [ ["", "108.864", "", "INTERCAMBIADORES DE", "1123.60 210.08 166.71 1333.68"], ["", "", "", "CALOR 8419500300", ""], ["", "147.420 5.000", "PZ", "1A0181810000", "81039.25 15149.52 19237.754880 96188.77"], ["", "147.420", "", "INTERCAMBIADORES DE", "3882.25 725.75 921.60 4608.00"], ["", "", "", "CALOR 8419500300", ""], ["", "566.093 12.000", "PZ", "1A0183660000", "66187.40 12374.29 6546.806709 78561.68"], ["", "566.093", "", "INTERCAMBIADORES DE", "3170.76 592.80 313.63 3763.56"], ["", "", "", "CALOR 8419500300", ""], ["", "3.645 1.000", "PZ", "1A0185890000", "836.64 159.69 996.330339 996.33"], ["", "3.645", "", "INTERCAMBIADORES DE", "40.08 7.65 47.73 47.73"], ["", "", "", "CALOR 8419500300", ""], ["", "131.998 3.000", "PZ", "1A0190390000", "32819.41 6135.17 12984.858315 38954.57"], ["", "131.998", "", "INTERCAMBIADORES DE", "1572.24 293.91 622.05 1866.15"], ["", "", "", "CALOR 8419500300", ""], ["", "123.833 3.000", "PZ", "1A0190790000", "54769.36 10238.84 21669.402087 65008.21"], ["", "123.833", "", "INTERCAMBIADORES DE", "2623.77 490.50 1038.09 3114.27"], ["", "", "", "CALOR 8419500300", ""], ["", "115.214 2.000", "PZ", "1A0195920000", "54642.66 10215.05 32428.851279 64857.70"], ["", "115.214", "", "INTERCAMBIADORES DE", "2617.70 489.36 1553.53 3107.06"] ] df = pd.DataFrame(data, columns=["1", "2", "3", "4", "5"]) # 替换空字符串为NaN,便于处理空值 df = df.replace('', np.nan) # 生成分组ID:以列3(含PZ的行)作为分组标识,连续的不完整行归为同一组 df['group_id'] = df['3'].notna().cumsum() # 分组合并:将每组内各列的非空值用空格连接,生成完整行 merged_df = df.groupby('group_id').agg(lambda x: ' '.join(x.dropna().astype(str))).reset_index(drop=True) # 输出合并后的结果 print(merged_df)
关键步骤说明
- 空值处理:将空字符串转为
NaN,避免后续合并时出现无效内容。 - 分组划分:通过列3是否包含
PZ来识别完整行,将其与前面的不完整行划分为同一组。 - 合并操作:对每个分组,将每列的非空值拼接成完整内容,确保每行都包含该组的所有有效数据。
自定义调整
- 如果需要修改列内容的分隔符,可将
' '替换为其他符号(如'|')。 - 如果分组逻辑需要调整(比如以列4的编码为标识),可修改
group_id的生成规则,例如:df['group_id'] = df['4'].str.startswith('1A').cumsum()
内容的提问来源于stack exchange,提问作者JavierIaDev
相关产品推荐
相关产品推荐

