You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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. 提取每个客户对应的唯一年份(确保每个客户的年份统一)
  2. 为每个客户生成1-12月的完整月份序列
  3. 将完整组合与原DataFrame合并,填充缺失的total值为0
  4. 按客户和月份排序,整理最终结果

完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 17:58:10