【问题标题】:Python pandas: rolling sum does not produce 12 month sumPython pandas:滚动总和不会产生 12 个月的总和
【发布时间】:2020-11-24 00:52:01
【问题描述】:

我的数据框看起来像:

df

ID      RY    Month INCIDENT_NO
AB10    2019    7   3
AB10    2019    12  3
AB1286  2011    5   2
AB1286  2012    1   2
AB1286  2014    4   1

我正在尝试根据 ID 创建 12 个月的 INCIDENT_NO 滚动总和。我正在编写如下代码:

df.groupby('ID').rolling(12,on='RY').INCIDENT_NO.sum()

它产生以下输出:

  ID         RY  
    AB10      2019     NaN
              2019     NaN
    AB1286    2011     NaN
              2012     NaN
              2014     NaN
                      ... 
    WS7       2020    30.0
    WS8       2016     NaN
    WS9       2014     NaN
              2018     NaN
              2019     NaN

但是,它没有产生预期的结果。比如ID AB10中,2019 RY出现了两次,应该出现一次。谁能指出我在哪里犯了错误?此外,我想显示每年的滚动总和(即使数据不存在)。例如,ID ws9 没有 RY 2020 的任何数据,它应该显示 sum 为零。

任何帮助将不胜感激。

【问题讨论】:

  • 以下任何答案是否解决了您的问题?或者,还有问题吗?

标签: python python-3.x pandas


【解决方案1】:

如果您的数据中缺少年份和月份,那么您可以对数据执行reindex 并创建一个pivot_table

df = df.groupby(["ID", "RY", "Month"])['INCIDENT_NO'].sum().reset_index()
idx = pd.MultiIndex.from_product([df['ID'].unique(),
                              range(df['RY'].min(), df['RY'].max()+1),
                              range(df['Month'].min(), df['Month'].max()+1)],
                             names=['ID', 'RY', 'Month'])
(df.set_index(["ID", "RY", "Month"]).reindex(idx).sort_index().fillna(0).reset_index()
 .pivot_table(index='ID', values='INCIDENT_NO', columns='RY', aggfunc='sum'))

Out[205]: 
RY      2011  2012  2013  2014  2015  2016  2017  2018  2019
ID                                                          
AB10     0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   6.0
AB1286   2.0   2.0   0.0   1.0   0.0   0.0   0.0   0.0   0.0

【讨论】:

  • 它会抛出这个错误 ValueError: cannot handle a non-unique multi-index!
  • @user2293224 如果 oyu 在开头添加 df = df.groupby(["ID", "RY", "Month"])['INCIDENT_NO'].sum().reset_index() 以对可能重复的行求和怎么办?我已经修改了我的代码。
【解决方案2】:

我认为您应该首先通过将“ID”、“RY”和“月”分组(每行代表每个月)来确保每个 ID 上每个月的数据按正确的升序排列,然后只需添加滚动(12)

df.groupby(['ID', 'RY', 'month']).rolling(12).sum()

【讨论】:

    【解决方案3】:

    我认为你需要groupbysum

    df.groupby(['ID','RY'], as_index=False)['INCIDENT_NO'].sum().fillna(0, downcast='infer')
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2018-03-01
      • 1970-01-01
      • 2021-02-11
      • 2022-08-02
      • 2021-08-14
      • 1970-01-01
      • 2019-01-04
      • 2019-07-12
      相关资源
      最近更新 更多