我有一个这样的熊猫数据框:
RECEIPT USD TYPE
1 10.00 Paper
2 12.00 Digital
3 5.00 Note
4 10.00 Paper
5 12.00 Paper
6 5.00 Digital
如果按TYPE列对数据进行分组,则会得到以下信息:
balance = df.groupby(['TYPE'])['USD'] \
.agg(['sum', 'count']) \
.reset_index() \
.rename(columns={'sum': 'TOTAL', 'count': 'COUNT'})
TYPE TOTAL COUNT
Digital 17.00 2
Note 5.00 1
Paper 32.00 3
但是,如果我想仅将数字收据和其余信息作为一行获得,该怎么办。我知道如何在原始数据框中的另一列上执行此操作,但是也许有一种更优雅的方法。
所需结果:
TYPE TOTAL COUNT
Digital 17.00 2
Remainder 37.00 4
答案 0 :(得分:2)
您可以groupby
使用布尔蒙版
mask = (df.TYPE=='Digital').map({False: 'Remainder', True:'Digital'})
或者使用np.where
(IMO是一种更为优雅的解决方案)
mask = np.where(df.TYPE=='Digital', 'Remainder', 'Digital')
两者都会产生
df.groupby(mask)['USD'] \
.agg(['sum', 'count']) \
.reset_index() \
.rename(columns={'sum': 'TOTAL', 'count': 'COUNT'})
TYPE TOTAL COUNT
0 Digital 17.0 2
1 Remainder 37.0 4
对于两个以上的组,您可以将np.select
用作mask
np.select([df.TYPE == 'Digital', (df.TYPE == 'Paper') | (df.TYPE=='Note'), df.TYPE=='Mail'],
['Digital', 'Paper', 'Remainder']