2014-02-05 107 views
3

我迷失在Pandas文档中,并尝试通过列总和的值来找出groupby a 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产生的数据帧将有列标签等于它合计的列的总和。像这样:

1 9 
0 2 2 
1 1 3 
2 0 4 

是否有任何想法让我朝好的方向发展?提前致谢 !

+0

是否有您发现的文档部分特别令人困惑?或者,将文档翻译成您的特定问题很难吗?如果您有任何改进,请务必在[Github]上分享它们(https://github.com/pydata/pandas/issues) – TomAugspurger

+0

[完成](https://github.com/pydata/pandas/issues/6288) 。再次感谢。 – mazieres

回答

8

在这里你去:

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,bc)和9(列d)。你想分组列(axis=1),并采取每个组的总和。

+0

这就是......谢谢! :) – mazieres

+0

创意!可能会将此示例添加到groupby文档? – Jeff

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 
+0

哦!我认为@ TomAugspurger的答案比我的好! (我们必须同时输入它们!) – LondonRob

+1

在记住groupby的'axis'参数之前,我开始采用和你一样的方式。我不认为我曾经使用它。 – TomAugspurger