python - 创建缺少月份和年份且对应值为零的新行
问题描述
我已经在几个月内使用 group by 提取了详细信息。但不幸的是,如果月份中不存在数据,则不会为该月份创建任何记录。
请帮助我为每个公司创建新记录,其中数据范围从 2019 年 4 月开始,到 2020 年 2 月结束。
Company year month Quantity
A 2019 4 1
A 2019 5 12
A 2019 6 13
A 2019 11 23
A 2020 2 34
B 2019 8 32
B 2019 12 2
B 2020 2 32
完全按照以下格式。任何输入都会有很大帮助。
Company year month Quantity
A 2019 1 0
A 2019 2 0
A 2019 3 0
A 2019 4 0
A 2019 5 12
A 2019 6 13
A 2019 7 0
A 2019 8 0
A 2019 9 0
A 2019 10 0
A 2019 11 23
A 2019 12 0
A 2020 1 0
A 2020 2 34
B 2019 1 0
B 2019 2 0
B 2019 3 0
B 2019 4 0
B 2019 5 0
B 2019 6 0
B 2019 7 0
B 2019 8 32
B 2019 9 0
B 2019 10 0
B 2019 11 0
B 2019 12 2
B 2020 1 0
B 2020 2 32
解决方案
如果想要整月MultiIndex.from_product
使用Series.reindex
:
mux = pd.MultiIndex.from_product([df['Company'].unique(),
df['year'].unique(),
range(1, 13)], names=['Company','year','month'])
df = df.set_index(['Company','year','month']).reindex(mux, fill_value=0).reset_index()
Series.between
如有必要,通过最大和最小日期时间使用的原始数据过滤出最小和最大日期时间:
orig = pd.to_datetime(df[['year','month']].assign(day=1))
new = pd.to_datetime(df1[['year','month']].assign(day=1))
df1 = df1[new.between(orig.min(), orig.max())]
print (df1)
Company year month Quantity
3 A 2019 4 1
4 A 2019 5 12
5 A 2019 6 13
6 A 2019 7 0
7 A 2019 8 0
8 A 2019 9 0
9 A 2019 10 0
10 A 2019 11 23
11 A 2019 12 0
12 A 2020 1 0
13 A 2020 2 34
27 B 2019 4 0
28 B 2019 5 0
29 B 2019 6 0
30 B 2019 7 0
31 B 2019 8 32
32 B 2019 9 0
33 B 2019 10 0
34 B 2019 11 0
35 B 2019 12 2
36 B 2020 1 0
37 B 2020 2 32
推荐阅读
- php - 如果来自特殊链接或站点,将用户重定向到其他代码
- r - 将两个 addLayersControl 添加到一张地图(标记位于多个组中)
- python - lambda 表达式中的未定义变量
- batch-file - 需要创建一个批处理文件
- angular - Angular Universal 错误 - app.auth 不是函数
- c# - 在 Postgres 数据库中创建用户
- python - 如何从基于python hashbang的powershell运行python程序?
- scala - Scala 猫:尝试对 `Eq` 特征使用 `===` 语法时出现隐含问题
- java - 如何填充列表
来自 IntStream? - python - 在不修改子进程的情况下检查子 Python 进程的变量