如何合并DataFrame中两个含NaN的同名ID列?
合并DataFrame中同名且互补的ID列
问题场景
DataFrame(df)包含两个同名的ID列,每行的两个ID列中一个为有效ID值,另一个为NaN,需将这两列合并为单个ID列,自动忽略NaN值,最终得到仅含有效ID的单列结果。
输入示例
| Date | ... | ID | ID |
|---|---|---|---|
| 12/12/2019 | ... | DE1253 | NaN |
| 12/12/2018 | ... | eg562r | NaN |
| 12/12/2021 | ... | gse233 | NaN |
| 12/12/2019 | ... | NaN | wefg32 |
| 12/11/2010 | ... | NaN | rte422 |
| 12/10/2021 | ... | NaN | 3fdes4 |
期望输出
| Date | ... | ID |
|---|---|---|
| 12/12/2019 | ... | DE1253 |
| 12/12/2018 | ... | eg562r |
| 12/12/2021 | ... | gse233 |
| 12/12/2019 | ... | wefg32 |
| 12/11/2010 | ... | rte422 |
| 12/10/2021 | ... | 3fdes4 |
解决方法
方法1:快速填充合并(推荐)
利用bfill向后填充NaN,直接提取合并后的有效值:
# 对所有ID列执行向后填充,取第一列作为合并后的ID df['ID'] = df['ID'].bfill(axis=1).iloc[:, 0] # 删除重复的ID列,保留唯一的ID列 df = df.loc[:, ~df.columns.duplicated()]
方法2:逐行合并填充
使用combine_first明确将第一列的NaN用第二列的值覆盖:
# 获取两个ID列的数据集 id_columns = df['ID'] # 合并两列,用第二列的值填充第一列的NaN df['ID'] = id_columns.iloc[:, 0].combine_first(id_columns.iloc[:, 1]) # 去重列 df = df.loc[:, ~df.columns.duplicated()]
方法3:堆叠分组提取
适合扩展到多列同名的场景,通过堆叠和分组提取每行的有效值:
# 堆叠ID列,过滤NaN后按行索引分组取第一个有效值 df['ID'] = df['ID'].stack().groupby(level=0).first() # 删除重复列 df = df.loc[:, ~df.columns.duplicated()]
内容的提问来源于stack exchange,提问作者Solrac
相关产品推荐
相关产品推荐

