[英]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,1
是f0
和2
是f1
)进行分箱,并对每个箱内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.