【问题标题】:Cumulative sum for duplicate rows重复行的累积和
【发布时间】:2019-05-10 22:19:30
【问题描述】:

所以我在使用 pandas 查找累积总和时遇到了一些问题。

我有一个这样的数据框:

df = pd.DataFrame({
    'Date': ['2018-04-01', '2018-04-01', '2018-04-01', '2018-05-01', '2018-05-01','2018-05-01','2018-04-01','2018-05-01'],
    'Category': ['AA', 'AA', 'AA', 'AA', 'AA','AA','AA','AA'],
    'Product': ['a', 'a', 'a', 'a', 'a','a','x','x'],
    'Volumes': [10,30,40,50,60,10,1,2]})

Date         Category       Product     Volumes
2018-04-01     AA               a           10
2018-04-01     AA               a           30
2018-04-01     AA               a           40
2018-05-01     AA               a           50
2018-05-01     AA               a           60
2018-05-01     AA               a           10
2018-04-01     AA               x           1
2018-05-01     AA               x           2


也就是说,有些产品在同一日期重复,有些产品是唯一的。

我想这样求累计和:

df = pd.DataFrame({
    'Date': ['2018-04-01', '2018-04-01', '2018-04-01', '2018-05-01', '2018-05-01','2018-05-01','2018-04-01','2018-05-01'],
    'Category': ['AA', 'AA', 'AA', 'AA', 'AA','AA','AA','AA'],
    'Product': ['a', 'a', 'a', 'a', 'a','a','x','x'],
    'Volumes': [80,80,80,190,190,190,1,3]})


Date         Category       Product     Volumes
2018-04-01     AA               a           80
2018-04-01     AA               a           80
2018-04-01     AA               a           80
2018-05-01     AA               a           200
2018-05-01     AA               a           200
2018-05-01     AA               a           200
2018-04-01     AA               x           1
2018-05-01     AA               x           3

其中 80 是 4 月的总和,200 是 4 月和 5 月的总和。

我试过一个简单的

 df.groupby(['Category', 'Product'])['Volumes'].agg(['sum']).reset_index()```


But that doesnt give me the desired output. 

Any suggestions?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    更新,在sum之后使用cumsum,然后merge返回

    s=df.groupby([df['Date'].dt.month,df['Category'],df['Product']])['Volumes'].sum().reset_index()
    s['New']=s.groupby(['Category','Product'])['Volumes'].cumsum()
    df=df.assign(Date=df.Date.dt.month,Date1=df.Date).merge(s.drop('Volumes',1),on=['Date','Category','Product'])
    df
    Out[575]: 
       Date Category Product  Volumes      Date1  New
    0     4       AA       a       10 2018-04-01   80
    1     4       AA       a       30 2018-04-01   80
    2     4       AA       a       40 2018-04-01   80
    3     5       AA       a       50 2018-05-01  200
    4     5       AA       a       60 2018-05-01  200
    5     5       AA       a       10 2018-05-01  200
    6     4       AA       x        1 2018-04-01    1
    7     5       AA       x        2 2018-05-01    3
    

    【讨论】:

      【解决方案2】:

      您可以使用两个单独的groupby 电话获得您想要的答案:

      df['new'] = df.groupby(['Category','Product'])['Volumes'].transform('cumsum')
      df['new'] = df.groupby(['Date','Category','Product'])['new'].transform('max')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2015-10-26
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多