我正在尝试找出对我的数据进行简单透视的最佳方法:
import pandas
dfn = pandas.DataFrame({
"A" : [ 'aaa', 'bbb', 'aaa', 'bbb' ],
"B" : [ 1, 10, 2, 30 ],
"C" : [ 2, 0, 3, 20 ] })
我想要输出是一个数据帧,按A
分组,B
和C
的总和和计数值,名称必须准确(Sum_B
,Sum_C
,Count
),如下所示:
A Sum_B Sum_C Count
aaa 3 5 2
bbb 50 20 2
完成此操作的最快方法是什么?
发布于 2016-06-22 10:39:14
您可以使用.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
发布于 2016-06-22 10:46:08
我认为您可以将aggregate
与双sum
和len
、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
size
和count
之间的差异(请参阅differences with numeric values):
发布于 2016-06-22 10:37:23
一种方法是按所需的列分组,然后按如下所示求和。
r = dfn.groupby('A').sum()
r['counts'] = dfn.A.value_counts() # this could also be written as dfn['A'].value_counts()
第一行计算总和,第二行计算每个值在A中出现的次数。
https://stackoverflow.com/questions/37965380
复制相似问题