按数据框中的列分组,但将其中一些分组汇总为一组

时间:2018-10-19 14:02:43

标签: python python-3.x pandas pandas-groupby

我有一个这样的熊猫数据框:

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

1 个答案:

答案 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']