import numpy as np
import pandas as pd
from pandas import DataFrame
df = DataFrame({'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':[1,2,3,2,5],
'data2':np.random.randn(5)})
print(df)
# data1 data2 key1 key2
# 0 1 0.493919 a one
# 1 2 -0.887280 a two
# 2 3 -0.267727 b one
# 3 2 0.048972 b two
# 4 5 0.309441 a one
Pandas中最为常用和有效的分组函数。
# 根据单个列分组
group1 = df.groupby('key1')
print(group1)
#
# 根据多个列分组
group2 = df.groupby(['key1','key2'])
print(group2)
#
# 遍历group1中的元素
l=[x for x in group1]
print(l)
# [('a', data1 data2 key1 key2
# 0 1 0.493919 a one
# 1 2 -0.887280 a two
# 4 5 0.309441 a one),
# ('b', data1 data2 key1 key2
# 2 3 -0.267727 b one
# 3 2 0.048972 b two)]
# 调用聚合函数打印出每个组中结果
print(group1.size())
# key1
# a 3
# b 2
# dtype: int64
print(group1.sum() )
# data1 data2
# key1
# a 8 -0.083919
# b 5 -0.218755
print(group1.count())
# data1 data2 key2
# key1
# a 3 3 3
# b 2 2 2
print(group1['data1'].agg('mean'))
# key1
# a 2.666667
# b 2.500000
# Name: data1, dtype: float64
print(group1['data1'].agg(['mean','sum']))
# mean sum
# key1
# a 2.666667 8
# b 2.500000 5
print(group1['data1','data2'].agg(['mean','sum']))
# data1 data2
# mean sum mean sum
# key1
# a 2.666667 8 -0.556335 -1.669005
# b 2.500000 5 0.052789 0.105577
print(df.groupby('key1').apply(np.mean))
# data1 data2
# key1
# a 2.666667 0.083070
# b 2.500000 -0.346864
print(df.groupby(['key1','key2']).apply(np.mean))
# data1 data2
# key1 key2
# a one 3.0 0.556917
# two 2.0 -0.864626
# b one 3.0 0.723882
# two 2.0 -1.417610
可以产生类似于excel数据透视表的结果,相当的直观。
print(pd.pivot_table(df, index='key1', columns='key2'))
# data1 data2
# key2 one two one two
# key1
# a 3 2 0.246833 1.018249
# b 3 2 -0.508228 1.298586
print(df.pivot_table(['data1'], index='key1',columns='key2'))
# data1
# key2 one two
# key1
# a 3 2
# b 3 2
print(df.pivot_table(index='key1',columns='key2', margins=True))
# data1 data2
# key2 one two All one two All
# key1
# a 3.0 2.0 2.666667 0.246833 1.018249 0.503971
# b 3.0 2.0 2.500000 -0.508228 1.298586 0.395179
# All 3.0 2.0 2.600000 -0.004854 1.158417 0.460454
可以按照指定的行和列统计分组频数,用起来非常方便;当然同样的功能也可采用groupby实现。
print(pd.crosstab(df.key1,df.key2, margins=True))
# key2 one two All
# key1
# a 2 1 3
# b 1 1 2
# All 3 2 5