我试图找出对数据进行简单转换的最佳方法:
import pandas
dfn = pandas.DataFrame({
"A" : [ 'aaa', 'bbb', 'aaa', 'bbb' ],
"B" : [ 1, 10, 2, 30 ],
"C" : [ 2, 0, 3, 20 ] })
我想要的输出是一个按A
分组的数据帧,B
和C
的总和和计数值,名称必须是{{1} }},Sum_B
,Sum_C
),如下所示:
Count
最快的方法是什么?
答案 0 :(得分:3)
您可以使用.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以下是link
提供的示例@evan54答案 1 :(得分:2)
我认为您可以this is running display window使用sum
和len
,aggregate
列以及rename
列的最后更改顺序:
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
如果需要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)
.reset_index())
A Sum_B Sum_C Count
0 aaa 3 5 2
1 bbb 40 20 2
相反len
您可以使用size
,但同样如此:
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
reset_index
与size
之间的差异(请参阅count
):
答案 2 :(得分:1)
执行此操作的一种方法是按所需列进行分组,然后按如下所示求和。
r = dfn.groupby('A').sum()
r['counts'] = dfn.A.value_counts() # this could also be written as dfn['A'].value_counts()
第一行计算总和,第二行获得每个值在A中出现的次数。