不同列的分组,不同的列与下一日期的累加和进行聚集
问题描述
我有一个按日期和时间排序的数据帧,如下所示:
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
中按组聚合sum
、size
和last
,然后选择num
和denum
并使用累加和上次添加者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')
相关文章