pandas 在Groupby上用零填充缺少的月份

aoyhnmkz  于 2023-02-07  发布在  其他
关注(0)|答案(1)|浏览(180)

我有一个panda Dataframe ,包含以下列:

Posting Date从2018-01-01(yyyy-mm-dd)到2022-10-30(yyyy-mm-dd)我想按MaterialPosting Date日期对 Dataframe 进行分组,粒度为1个月,对于Posting Date范围内的月份,用零填充Total_Sum。

Material        Posting Date      Total_Sum
0   E7400R101012      2018-01            0
1   E7400R101012      2018-02            0
2   E7400R101012      2018-03            0
3   E7400R101012      2018-04            0
4   E7400R101012      2018-05            0
5   E7400R101012      2018-06            2
6   E7400R101012      2018-07            0
7   E7400R101012      2018-08            0
8   E7400R101012      2018-09            0
9   E7400R101012      2018-10            0
10  E7400R101012      2018-11            3
11  E7400R101012      2018-12            0
--                     ---
nn  E7400R101012      2022-10            0
nn  NEW CODE          2018-01            0
uxhixvfz

uxhixvfz1#

Series.dt.to_period将列Posting Date转换为月周期,因此可以按最小值和最大值创建period_range,并创建MultiIndex.from_product
然后聚合sum并按DataFrame.reindex添加缺失对:

df1['Posting Date'] = pd.to_datetime(df1['Posting Date']).dt.to_period('m')
periods = pd.period_range(df1['Posting Date'].min(), df1['Posting Date'].max(), freq='m')
mux = pd.MultiIndex.from_product([df1['Material'].unique(), 
                                  periods], 
                                  names=['Material', 'Posting Date'])

df2 = (df1.groupby(['Material', 'Posting Date']).sum()
          .reindex(mux, fill_value=0)
          .reset_index())

相关问题