如何将Pandas分组后的多个DataFrame合并为单个数据集?
Pandas分组合并后汇总为单个DataFrame问题
问题描述
我是Python新手,现有包含ID、ENTITY_NAME、ENTITY_VALUE、SECTION_GROUP、DOC_ID列的数据集,执行以下Pandas代码按SECTION_GROUP分组,并将SECTION_GROUP为NaN的行合并至每个分组结果,得到两个独立的DataFrame。现需将这两个结果合并为单个完整的DataFrame,寻求技术帮助。
原数据集
| ID | ENTITY_NAME | ENTITY_VALUE | SECTION_GROUP | DOC_ID |
|---|---|---|---|---|
| 1 | dNumber | U220059090 | GROUP 1 | 40 |
| 2 | tDate | 6-Dec-22 | GROUP 1 | 40 |
| 3 | dNumber | U220059090 | GROUP 2 | 40 |
| 4 | tDate | 6-Dec-22 | GROUP 2 | 40 |
| 5 | sCompany | bp | nan | 40 |
| 6 | dNumber | U220059090 | GROUP 1 | 45 |
| 7 | tDate | 6-Dec-22 | GROUP 1 | 45 |
| 8 | dNumber | U220059090 | GROUP 2 | 45 |
| 9 | tDate | 6-Dec-22 | GROUP 2 | 45 |
| 10 | sCompany | bp | nan | 45 |
执行代码
import pandas as pd import numpy as np df = pd.read_csv ('dups_check_group_v1.csv',encoding= 'unicode_escape',usecols= ['ID','ENTITY_NAME','ENTITY_VALUE','SECTION_GROUP','DOC_ID']) mask = df['SECTION_GROUP'].isna() rest = df[mask] for _, g in df[~mask].groupby('SECTION_GROUP'): g = pd.concat([g, rest]) print(g)
当前输出结果
ID ENTITY_NAME ENTITY_VALUE SECTION_GROUP DOC_ID 0 1 dNumber U220059090(C) GROUP 1 40 1 2 tDate 6-Dec-22 GROUP 1 40 5 6 dNumber U220059090(C) GROUP 1 45 6 7 tDate 6-Dec-22 GROUP 1 45 4 5 sCompany bp NaN 40 9 10 sCompany bp NaN 45 ID ENTITY_NAME ENTITY_VALUE SECTION_GROUP DOC_ID 2 3 dNumber U220059090(C) GROUP 2 40 3 4 tDate 6-Dec-22 GROUP 2 40 7 8 dNumber U220059090(C) GROUP 2 45 8 9 tDate 6-Dec-22 GROUP 2 45 4 5 sCompany bp NaN 40 9 10 sCompany bp NaN 45
期望输出结果
ID ENTITY_NAME ENTITY_VALUE SECTION_GROUP DOC_ID 0 1 dNumber U220059090(C) GROUP 1 40 1 2 tDate 6-Dec-22 GROUP 1 40 5 6 dNumber U220059090(C) GROUP 1 45 6 7 tDate 6-Dec-22 GROUP 1 45 4 5 sCompany bp NaN 40 9 10 sCompany bp NaN 45 2 3 dNumber U220059090(C) GROUP 2 40 3 4 tDate 6-Dec-22 GROUP 2 40 7 8 dNumber U220059090(C) GROUP 2 45 8 9 tDate 6-Dec-22 GROUP 2 45 4 5 sCompany bp NaN 40 9 10 sCompany bp NaN 45
解决方案
你当前的代码只是在循环里打印每个分组合并后的结果,没有把它们收集起来合并成一个DataFrame。可以通过一个列表来存储每个分组处理后的DataFrame,最后用pd.concat把列表里的所有DataFrame合并成一个完整的结果。
修改后的代码如下:
import pandas as pd import numpy as np df = pd.read_csv('dups_check_group_v1.csv', encoding='unicode_escape', usecols=['ID','ENTITY_NAME','ENTITY_VALUE','SECTION_GROUP','DOC_ID']) mask = df['SECTION_GROUP'].isna() rest = df[mask] # 创建列表存储每个分组处理后的结果 result_frames = [] for _, g in df[~mask].groupby('SECTION_GROUP'): merged_group = pd.concat([g, rest]) result_frames.append(merged_group) # 合并所有分组结果为单个DataFrame final_df = pd.concat(result_frames) print(final_df)
这段代码会将每个分组合并NaN行后的DataFrame存入result_frames列表,最后通过pd.concat将列表中的所有DataFrame纵向拼接,得到你期望的完整DataFrame。如果需要重置索引,可以在pd.concat中添加ignore_index=True参数。
内容的提问来源于stack exchange,提问作者tt0206
相关产品推荐
相关产品推荐

