Pandas按单键合并DataFrame,指定列仅首次保留非空值
解决Pandas合并后Status列重复值问题
步骤1:执行初始合并
先运行你原本的合并代码,得到包含重复status值的DataFrame:
import pandas as pd # 构造示例数据 DF1 = pd.DataFrame({ 'employee': ['x12345', 'x12345', 'z12345', 'z12345'], 'year': [2023, 2022, 2015, 2013] }) DF2 = pd.DataFrame({ 'employee': ['x12345', 'z12345', 'm12345', 'q12345'], 'status': ['active', 'active', 'inactive', 'active'] }) # 初始合并操作 merged = pd.merge(DF1, DF2, how="outer", on=["employee"])
步骤2:处理重复的Status值
通过分组标记的方式,仅保留每个employee组内第一条记录的status值,其余替换为Pandas的缺失值(对应你要的NULL):
# 标记每个employee的第一条记录 merged['is_first'] = merged.groupby('employee').cumcount() == 0 # 仅保留第一条的status,其余设为缺失值 merged['status'] = merged['status'].where(merged['is_first'], pd.NA) # 删除临时标记列 merged = merged.drop('is_first', axis=1)
或者用更简洁的transform写法:
merged['status'] = merged.groupby('employee')['status'].transform( lambda x: x.where(x.index == x.first_valid_index(), pd.NA) )
最终效果
处理后的数据框会匹配你的期望:
| employee | year | status |
|---|---|---|
| x12345 | 2023 | active |
| x12345 | 2022 | |
| z12345 | 2015 | active |
| z12345 | 2013 | |
| m12345 | NaN | inactive |
| q12345 | NaN | active |
注:Pandas中用
pd.NA表示缺失值,显示时会呈现为<NA>,和你需要的NULL效果一致。
内容的提问来源于stack exchange,提问作者hungrypuggos
相关产品推荐
相关产品推荐

