不同列的分组,不同的列与下一日期的累加和进行聚集

2022-02-26 00:00:00 python pandas pandas-groupby cumsum

问题描述

我有一个按日期和时间排序的数据帧,如下所示:

 ID     Date     Time      A         B      C
 abc   06/Feb     11       12        12     10 
 abc   06/Feb     12       14        13     5
 xyz   07/Feb      1       16        14     50
 xyz   07/Feb      2       18        15     0
 xyz   07/Feb      3       20        16     10

我想按ID和日期分组,并以SUM为分子,COUNT为分母,但对于下一个日期,总和将是前几个日期的累加,COUNT将作为Cumcount,A、B、C列的最后一个值的另外3列将被添加。例如:

ID    Date     A_Num  A_denom   B_Num   B_Denom  C_Num   C_Denom  A_Last  B_Last  C_Last
abc   06/Feb    26       2        25       2      15        2       14      13      5
xyz   07/Feb    54       3        45       3      60        3       20      16      10

我不能一次完成所有这些操作..有人能在这方面帮助我吗?提前谢谢。

现在我想将df1 acc中的df2添加到id为:

ID    Date     A_Num  A_denom   B_Num   B_Denom  C_Num   C_Denom  A_Last  B_Last  C_Last
abc   06/Feb    52       4        50       4      30        4       14      13      5
xyz   07/Feb    108      6        90       6      120       6       20      16      10

解决方案

您可以在GroupBy.agg中按组聚合sumsizelast,然后选择numdenum并使用累加和上次添加者concat由Aggregate创建的另一个数据帧GroupBy.last

cols = ['A','B','C']

print (df[cols].dtypes)
A    int64
B    int64
C    int64
dtype: object

d = {'sum':'Num','size':'denom'}
df1 = df.groupby(['ID','Date'])[cols].agg(['sum','size']).rename(columns=d).cumsum()
df1.columns = df1.columns.map(lambda x: f'{x[0]}_{x[1]}')

df2 = df.groupby(['ID','Date'])[cols].last().add_suffix('_Last')
df3 = pd.concat([df1, df2], axis=1).reset_index()

print (df3)
    ID    Date  A_Num  A_denom  B_Num  B_denom  C_Num  C_denom  A_Last  
0  abc  06/Feb     26        2     25        2     15        2      14   
1  xyz  07/Feb     80        5     70        5     75        5      20   

   B_Last  C_Last  
0      13       5  
1      16      10  

对于不使用索引的文件写入:

df3.to_csv('file', index=False)

如果解决方案使用中没有.reset_index

df3.to_csv('file')

相关文章