Python Pandas简单透视表求和计数

6

我正在寻找在我的数据上进行简单数据透视的最佳方法:

import pandas    
dfn = pandas.DataFrame({
    "A" : [ 'aaa', 'bbb', 'aaa', 'bbb' ],
    "B" : [     1,    10,     2,   30  ],
    "C" : [     2,     0,     3,   20  ] })

我想要的输出是一个数据框,按A分组,对BC的值进行求和和计数,并且列名必须完全匹配(Sum_BSum_CCount),如下所示:
A   Sum_B  Sum_C  Count
aaa    3      5       2
bbb   50     20       2

什么是最快的方法来完成这个任务?

我猜bbbSum_B应该是40而不是50,对吗? - evan54
3个回答

6
你可以使用 .agg() 函数来进行操作:.agg()
In [227]: dfn.groupby('A').agg({'B':sum, 'C':sum, 'A':'count'}).rename(columns={'A':'count'})
Out[227]:
      B  count   C
A
aaa   3      2   5
bbb  40      2  20

或者使用reset_index()函数:

In [239]: dfn.groupby('A').agg({'B':sum, 'C':sum, 'A':'count'}).rename(columns={'A':'count'}).reset_index()
Out[239]:
     A   B  count   C
0  aaa   3      2   5
1  bbb  40      2  20

PS 这里有一个链接,链接到由@evan54提供的示例。


1
之前不知道关于agg(aggregate)的用法,这篇文章描述得非常好。http://www.shanelynn.ie/summarising-aggregation-and-grouping-data-in-python-pandas/ - evan54
我还添加了 .reset_index() 以便将 'A' 移动到一列中,因为我需要编写一个 csv 文件。 - DPColombotto

3

我认为你可以使用 aggregate 函数,其中包含双重的 sumlen,使用 rename 函数对列进行重命名,并最后通过 reindex_axis 函数改变列的顺序:

print (dfn.groupby('A')
          .agg({'B': sum, 'C':sum, 'A':len})
          .rename(columns={'A': 'Count', 'B': 'Sum_B', 'C': 'Sum_C'})
          .reindex_axis(['Sum_B','Sum_C','Count'], axis=1))  

     Sum_B  Sum_C  Count
A                       
aaa      3      5      2
bbb     40     20      2

如果需要使用 reset_index 函数:
print (dfn.groupby('A')
          .agg({'B': sum, 'C':sum, 'A':len})
          .rename(columns={'A': 'Count', 'B': 'Sum_B', 'C': 'Sum_C'})
          .reindex_axis(['Sum_B','Sum_C','Count'], axis=1)
          .reset_index())  

     A  Sum_B  Sum_C  Count
0  aaa      3      5      2
1  bbb     40     20      2

您可以使用 size 代替 len ,它们的含义相同:

print (dfn.groupby('A')
          .agg({'B': sum, 'C':sum, 'A':'size'})
          .rename(columns={'A': 'Count', 'B': 'Sum_B', 'C': 'Sum_C'})
          .reindex_axis(['Sum_B','Sum_C','Count'], axis=1)
          .reset_index())  

     A  Sum_B  Sum_C  Count
0  aaa      3      5      2
1  bbb     40     20      2      

sizecount之间的区别(详见数值差异):


1
一种实现方法是按照所需的列进行分组,然后按照下面所示进行求和。
r = dfn.groupby('A').sum()
r['counts'] = dfn.A.value_counts() # this could also be written as dfn['A'].value_counts()

第一行计算总和,第二行获取A中每个值出现的次数。

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