如何在Python中基于ID填充DataFrame的Test Done列空值?
问题
现有如下DataFrame:
ID Test Done Test Action Test Date 1234 Happy Test Decline 2021-11-30 1234 None Decline None 1235 Sad Test Decline 2022-03-24 1235 None Decline 2022-03-04 1235 None Decline 2022-03-04 1236 Lonely Test Decline 2022-05-06 1236 Lonely Test Decline 2022-05-06 1236 Lonely Test Decline 2022-05-06
需要实现:用每个ID对应的Test Done列中第一个非None值,填充该ID下所有Test Done为None的行,已填充的行保持不变,最终得到如下结果:
ID Test Done Test Action Test Date 1234 Happy Test Decline None 1235 Sad Test Decline 2022-03-24 1235 Sad Test Decline 2022-03-04 1235 Sad Test Decline 2022-03-04 1236 Lonely Test Decline 2022-05-06 1236 Lonely Test Decline 2022-05-06 1236 Lonely Test Decline 2022-05-06
解决方案
使用Pandas的groupby+transform组合可以高效实现需求,核心逻辑是按ID分组后,用每组第一个非空的Test Done值填充组内所有空值:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'ID': [1234, 1234, 1235, 1235, 1235, 1236, 1236, 1236], 'Test Done': ['Happy Test', None, 'Sad Test', None, None, 'Lonely Test', 'Lonely Test', 'Lonely Test'], 'Test Action': ['Decline'] * 8, 'Test Date': ['2021-11-30', None, '2022-03-24', '2022-03-04', '2022-03-04', '2022-05-06', '2022-05-06', '2022-05-06'] }) # 填充逻辑 df['Test Done'] = df.groupby('ID')['Test Done'].transform( lambda grp: grp.fillna(grp.dropna().iloc[0]) if not grp.dropna().empty else grp ) # 输出结果 print(df)
关键细节
groupby('ID'):将数据按ID拆分,保证每个ID的填充独立进行transform:使分组处理后的结果能与原DataFrame的行一一对应,直接覆盖原列grp.dropna().iloc[0]:提取分组内第一个非空/非None的Test Done值;添加if not grp.dropna().empty是为了兼容某个ID下全为None的极端情况,避免索引报错fillna:用提取到的基准值填充分组内所有None值,已存在非空值的行不受影响
内容的提问来源于stack exchange,提问作者Astro_raf
相关产品推荐
相关产品推荐

