如何为DataFrame分组填充缺失的固定序列数据?
解决分组缺失序列填充问题
你的需求是按组内的位置填充固定序列,fillna(method='ffill')仅能做行方向的前向填充,无法满足按组内位置匹配填充的要求。以下用Python的pandas库解决数据量较大的场景:
步骤1:构造并预处理数据
先模拟你的数据集,将空字符串转为NaN方便后续处理:
import pandas as pd import numpy as np # 模拟原始数据集 data = { 'index': [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5], 'string': ['2008','2009','2010','','','','2008','2009','2010','2008','2009','2010','','',''] } df = pd.DataFrame(data) # 把空字符串转为NaN df['string'] = df['string'].replace('', np.nan)
步骤2:添加组内序号
给每个index组的行按顺序分配序号(0、1、2),用于匹配固定序列的位置:
df['group_seq'] = df.groupby('index').cumcount()
步骤3:提取序列映射
从任意完整的组中提取“组内序号-对应值”的映射关系:
# 从非缺失的行中提取映射 seq_map = df.dropna(subset=['string']).set_index('group_seq')['string'].to_dict()
步骤4:填充缺失值
用映射关系给所有缺失的string值填充对应位置的内容:
df['string'] = df['group_seq'].map(seq_map) # 移除临时的组内序号列 df = df.drop('group_seq', axis=1)
处理后的数据将完全符合你期望的结果:
index string 0 1 2008 1 1 2009 2 1 2010 3 2 2008 4 2 2009 5 2 2010 6 3 2008 7 3 2009 8 3 2010 9 4 2008 10 4 2009 11 4 2010 12 5 2008 13 5 2009 14 5 2010
扩展说明
如果每组的行数不是固定3个,只要所有组的行数一致,该方法依然适用——cumcount()会自动给每组的行按顺序分配序号,只要有至少一个完整组提供映射,就能给所有缺失组填充对应位置的值。
内容的提问来源于stack exchange,提问作者conduit
相关产品推荐
相关产品推荐

