基于ReportName列条件的Pandas ffill与bfill空值填充问题
按区间填充DataFrame的ID列
现有如下结构的DataFrame:
import pandas as pd data = { "ReportName": ["Sample cycle", 'Message', "ID", "m1", "Uncertainty m1", "Message", "Sample cycle", 'Message', "ID", "m0", "Uncertainty m0", "Message", "ID", "m1", "Uncertainty m1", "Message"], "Values": [ "1","NO", "II", None, None, "NO", "1", "NO", "ID1", "1.8", "0.43", "NO", "ID2", "1.5", "0.41", "NO"], } df = pd.DataFrame(data)
已经通过以下函数生成了初始的ID列:
def extract_id(row): if row['ReportName'] == 'ID': return row['Values'] return None df['ID'] = df.apply(extract_id, axis=1)
现在需要实现:在每个"Sample cycle"到下一个"Sample cycle"的区间内,用该区间对应的ID值填充ID列中的NaN,同时"Sample cycle"所在行的ID保持为None,最终期望输出如下:
ReportName Values ID 0 Sample cycle 1 None 1 Message NO II 2 ID II II 3 m1 None II 4 Uncertainty m1 None II 5 Message NO II 6 Sample cycle 1 None 7 Message NO ID1 8 ID ID1 ID1 9 m0 1.8 ID1 10 Uncertainty m0 0.43 ID1 11 Message NO ID1 12 ID ID2 ID2 13 m1 1.5 ID2 14 Uncertainty m1 0.41 ID2 15 Message NO ID2
实现方案
通过分组+填充的方式完成,具体代码如下:
# 生成分组标记:每遇到一个"Sample cycle"就创建一个新分组 df['group'] = df['ReportName'].eq('Sample cycle').cumsum() # 对每个分组内的ID列进行向后填充,自动用该分组内的有效ID填充后续NaN df['ID'] = df.groupby('group')['ID'].bfill() # 将"Sample cycle"行的ID重置为None df.loc[df['ReportName'] == 'Sample cycle', 'ID'] = None # 删掉临时的分组列 df = df.drop('group', axis=1)
运行上述代码后,就能得到符合要求的结果。
内容的提问来源于stack exchange,提问作者Ing DESIGN
相关产品推荐
相关产品推荐

