如何在Python中按列条件为DataFrame补充缺失行
问题:为每个客户补充全年12个月的数据,缺失月份total设为0
我有如下DataFrame:
import pandas as pd df = pd.DataFrame({ 'year': [2022]*19, 'month': [1,2,3,1,2,3,4,5,6,7,8,9,10,11,1,2,3,4,5], 'client':[1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3], 'total':[10,20,30,55,4,64,88,5,64,32,84,24,69,70,54,11,37,98,52] })
原始数据展示:
year month client total 0 2022 1 1 10 1 2022 2 1 20 2 2022 3 1 30 3 2022 1 2 55 4 2022 2 2 4 5 2022 3 2 64 6 2022 4 2 88 7 2022 5 2 5 8 2022 6 2 64 9 2022 7 2 32 10 2022 8 2 84 11 2022 9 2 24 12 2022 10 2 69 13 2022 11 2 70 14 2022 1 3 54 15 2022 2 3 11 16 2022 3 3 37 17 2022 4 3 98 18 2022 5 3 52
需求:每个client都包含12个月份的数据,补充缺失月份的行,新行的total列设为0,year列沿用该client已有行的年份。
期望输出示例(部分):
year month client total 0 2022 1 1 10 1 2022 2 1 20 2 2022 3 1 30 3 2022 4 1 0 ... 23 2022 12 2 0 ... 35 2022 12 3 0
我尝试过使用merge方法,但未得到理想结果,请问该如何解决?
解决方案
可以通过生成完整的客户-月份组合,再与原数据合并的方式实现,步骤如下:
- 提取每个客户对应的唯一年份(确保每个客户的年份统一)
- 为每个客户生成1-12月的完整月份序列
- 将完整组合与原DataFrame合并,填充缺失的
total值为0 - 按客户和月份排序,整理最终结果
完整代码:
import pandas as pd # 原始数据 df = pd.DataFrame({ 'year': [2022]*19, 'month': [1,2,3,1,2,3,4,5,6,7,8,9,10,11,1,2,3,4,5], 'client':[1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3], 'total':[10,20,30,55,4,64,88,5,64,32,84,24,69,70,54,11,37,98,52] }) # 1. 获取每个client对应的唯一year client_year = df[['client', 'year']].drop_duplicates() # 2. 生成每个client的1-12月完整序列 months = pd.DataFrame({'month': range(1, 13)}) full_index = client_year.merge(months, how='cross') # 3. 合并原始数据,填充total为0 result = full_index.merge(df, on=['client', 'year', 'month'], how='left').fillna({'total': 0}) # 4. 转换total为整数(可选,保持数据类型一致) result['total'] = result['total'].astype(int) # 5. 按client和month排序 result = result.sort_values(['client', 'month']).reset_index(drop=True) print(result)
代码说明:
client_year = df[['client', 'year']].drop_duplicates():提取每个客户对应的年份,确保每个客户只保留一条年份记录。full_index = client_year.merge(months, how='cross'):通过交叉连接生成每个客户与12个月份的完整组合,这是补充缺失行的核心。merge(..., how='left'):以完整组合为左表,合并原始数据,缺失的total会自动变为NaN。fillna({'total': 0}):将缺失的total值替换为0。- 最后排序并重置索引,得到符合要求的结果。
内容的提问来源于stack exchange,提问作者Cristina Dominguez Fernandez
相关产品推荐
相关产品推荐

