首页 > 解决方案 > Pandas groupby 削减总和

问题描述

我正在尝试对一列进行分箱并获取满足索引条件的行的总和。

这是我正在使用的 DataFrame 类型的示例:

df 

A    B    C    D
a    aa   0    1
a    aa   1    2
a    aa   2    10
a    bb   0    4
a    bb   1    5
a    bb   2    60
b    aa   0    7
b    aa   1    8
b    aa   2    90
b    bb   0    10
b    bb   1    11
b    bb   2    12

我想做的是首先对特征列C(即0,1isf02is f1)进行分类,并对每个 bin 中列中的值求和,D并且仍然保持各自的A索引对和 B` 索引对完整。结果如下:

A    B    C    D
a    aa   f0   3
a    aa   f1   10
a    bb   f0   9
a    bb   f1   60
b    aa   f0   15
b    aa   f1   90
b    bb   f0   21
b    bb   f1   12

我已经使用pandas.cut这样的方法完成了分箱:

cut = pd.cut(df['C'], bins=[0,2,3], right=False, labels=['f0','f1'])

但是我在保持索引对(列A,B)完好无损时遇到了麻烦df.groupby(cut),我不想遍历所有可能的(A,B)对并自己对它们进行 bin + 求和。

任何帮助,将不胜感激。

标签: pythonpandas

解决方案


您需要将定义所需组的附加列添加到您的 groupby 语句中:

from io import StringIO

import pandas

df = pandas.read_table(StringIO("""\
A    B    C    D
a    aa   0    1
a    aa   1    2
a    aa   2    10
a    bb   0    4
a    bb   1    5
a    bb   2    60
b    aa   0    7
b    aa   1    8
b    aa   2    90
b    bb   0    10
b    bb   1    11
b    bb   2    12"""), sep='\s+')

output = (
    df.assign(C=pandas.cut(df['C'], bins=[0,2,3], right=False, labels=['f0','f1']))
      .groupby(['A', 'B', 'C'], as_index=False)  
      .sum()  
)

 A   B   C   D
 a  aa  f0   3
 a  aa  f1  10
 a  bb  f0   9
 a  bb  f1  60
 b  aa  f0  15
 b  aa  f1  90
 b  bb  f0  21
 b  bb  f1  12

推荐阅读