繁体   English   中英

Pandas groupby 切和

[英]Pandas groupby cut sum

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

这是我正在使用的 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,1f02f1 )进行分箱,并对每个箱内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'])

但是我无法使用df.groupby(cut)保持索引对(列A,B )完好无损,我不想自己遍历所有可能的(A,B)对和 bin + 对它们求和。

任何帮助,将不胜感激。

您需要将定义所需组的附加列添加到您的 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

重新分配groupby中的值后,您可以在['A','B','C']上进行C

df['C'] = np.where(df['C'].isin([0,1]), 'f0', 'f1')
df = df.groupby(['A','B','C']).sum().reset_index()

结果:

   A   B   C   D
0  a  aa  f0   3
1  a  aa  f1  10
2  a  bb  f0   9
3  a  bb  f1  60
4  b  aa  f0  15
5  b  aa  f1  90
6  b  bb  f0  21
7  b  bb  f1  12

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM