重复行的累计和

2024-04-19 21:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我在使用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?

Tags: 数据方法dataframepandasdfdate产品product
2条回答

更新,在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

您可以使用两个独立的groupby呼叫获得所需的答案:

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

相关问题 更多 >