Pandas如何合并DataFrame中First Name相同的分散多行数据
Pandas 同标识多行非空属性合并为单行方案
针对同一First Name对应多行、每行仅存部分属性值、其余为空的数据集,按以下步骤处理即可得到单行单人员的规整结果:
- 预处理空值:先将所有空白单元格、空字符串统一替换为Pandas可识别的
NaN类型,否则聚合逻辑无法正确识别空值 - 分组聚合:以
First Name为分组键,对每个属性列取组内第一个非空值即可——由于每个人员的单个属性仅在一行存在有效值,其余行该字段均为空,该逻辑刚好能提取到所有有效属性
可直接运行的代码
import pandas as pd import numpy as np # 空值标准化:把空字符串、纯空格等无效空值替换为NaN df1 = df1.replace(r'^\s*$', np.nan, regex=True) # 分组聚合,取各列第一个非空值,保留First Name为普通列 clean_df = df1.groupby(by='First Name', as_index=False).first() # 如果不需要原分散存储的行索引Index列,可以指定聚合列排除Index # clean_df = df1.groupby(by='First Name', as_index=False)[['Age', 'Gender', 'Weight in lb', 'Height in cm']].first()
常见groupby失效原因
- 未做空值标准化:空单元格实际是空字符串、空格等非
NaN值,聚合时被判定为有效值,无法跳过取到真实属性- 聚合方法选择错误:误用
sum()、count()等聚合逻辑,没有使用可自动跳过空值取有效条目的first()/last()方法
冲突校验(可选)
如果需要确认是否存在同一人员同一属性录入了多个不同值的异常,可以运行以下代码校验,返回结果所有值为1即代表无冲突,聚合结果准确:
# 统计每个人员每个属性的不同值数量 conflict_check = df1.groupby('First Name')[['Age', 'Gender', 'Weight in lb', 'Height in cm']].nunique() print(conflict_check)
内容的提问来源于stack exchange,提问作者user18562240
相关产品推荐
相关产品推荐

