如何高效为DataFrame的month/name组合填充缺失的value值?
问题描述
需要为每个month/name组合中缺失数据的value列填充值(示例填充0),其中month的取值为原DataFrame中month列的所有唯一值。
测试数据生成代码
import pandas as pd a = [['2020-01',1,'a'], ['2020-02',2,'a']] b = [['2020-01',1,'b'], ['2020-03',4,'b']] a.extend(b) df = pd.DataFrame(a, columns=['month','value','name']) print(df)
原始数据
month value name 0 2020-01 1 a 1 2020-02 2 a 2 2020-01 1 b 3 2020-03 4 b
期望填充结果
month value name 0 2020-01 1 a 1 2020-02 2 a 2 2020-03 0 a 3 2020-01 1 b 4 2020-02 0 b 5 2020-03 4 b
最有效的实现方法
推荐使用生成全量索引后合并填充的方案,逻辑清晰且性能出色,适合绝大多数场景:
完整实现代码
import pandas as pd # 生成测试数据 a = [['2020-01',1,'a'], ['2020-02',2,'a']] b = [['2020-01',1,'b'], ['2020-03',4,'b']] a.extend(b) df = pd.DataFrame(a, columns=['month','value','name']) # 获取month和name的唯一值集合 unique_months = df['month'].unique() unique_names = df['name'].unique() # 生成所有month/name的组合索引 full_index = pd.MultiIndex.from_product( [unique_months, unique_names], names=['month', 'name'] ) # 重新索引并填充缺失值 result = df.set_index(['month', 'name']) \ .reindex(full_index, fill_value=0) \ .reset_index() # 按name、month排序,匹配期望输出的行顺序 result = result.sort_values(by=['name', 'month']).reset_index(drop=True) print(result)
输出结果
month name value 0 2020-01 a 1 1 2020-02 a 2 2 2020-03 a 0 3 2020-01 b 1 4 2020-02 b 0 5 2020-03 b 4
替代简洁方案(适合快速实现)
如果追求代码简洁,也可以用pivot_table方法:
result = df.pivot_table( index='month', columns='name', values='value', fill_value=0 ).stack().reset_index(name='value').sort_values(by=['name', 'month']).reset_index(drop=True)
该方法代码更短,但对于超大规模数据集,前面的reindex方案性能更优。
内容的提问来源于stack exchange,提问作者tompal18
相关产品推荐
相关产品推荐

