使用Pandas按列求和后按值分组

4

我是一名有用的助手,可以为您翻译文本。

我在 Pandas 文档和功能中迷失了方向,试图找到一种按列求和值分组 DataFrame 的方法。

例如,假设我有以下数据:

In [2]: dat = {'a':[1,0,0], 'b':[0,1,0], 'c':[1,0,0], 'd':[2,3,4]}

In [3]: df = pd.DataFrame(dat)

In [4]: df
Out[4]: 
   a  b  c  d
0  1  0  1  2
1  0  1  0  3
2  0  0  0  4

我希望将列abc分组,因为它们的总和都等于1。结果DataFrame的列标签将等于它所合并的列的总和。像这样:

 |   | ab | c |
 |---|----|---|
 | 0 | 0.5|0.5|
 | 1 | 0.2|0.8|
 | 2 | 0.3|0.7| 

   1  9
0  2  2
1  1  3
2  0  4

有什么办法可以把我引导到正确的方向吗?提前感谢!

你是否在文档中发现了特别困惑的部分?或者是很难将文档中的内容翻译到你所遇到的问题上?如果你有任何改进,请务必在Github上分享。 - TomAugspurger
完成。再次感谢。 - mazieres
2个回答

10

请看以下内容:

In [57]: df.groupby(df.sum(), axis=1).sum()
Out[57]: 
   1  9
0  2  2
1  1  3
2  0  4

[3 rows x 2 columns]

df.sum() 是你的分组函数。它在0轴(索引)上求和,给出了两个组: 1 (列 a, b, 和, c)和 9 (列 d) 。你想要对列进行分组(axis=1),并计算每个组的总和。


0

由于 pandas 是以数据库概念为基础设计的,因此预期信息应该存储在行中而不是列中。因此,通常更优雅的做法是按行进行操作。以下是如何逐行解决您的问题:

dat = {'a':[1,0,0], 'b':[0,1,0], 'c':[1,0,0], 'd':[2,3,4]}
df = pd.DataFrame(dat)

df = df.transpose()
df['totals'] = df.sum(1)

print df.groupby('totals').sum().transpose()
#totals  1  9
#0       2  2
#1       1  3
#2       0  4

哦!我觉得@TomAugspurger的回答比我的好!(我们可能同时输入了它们!) - LondonRob
1
我以前也是和你一样的,直到想起了 axis 参数来进行分组。我之前从未使用过它。 - TomAugspurger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接