私はこのようなパンダのデータフレームを持っています:
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
しかし、デジタルレシートだけの情報と残りの情報を1行で取得したい場合はどうでしょうか。元のデータフレームの別の列でそれを行う方法を知っていますが、もっとエレガントな方法があるかもしれません。
望ましい結果:
TYPE TOTAL COUNT
Digital 17.00 2
Remainder 37.00 4
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']
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加