pandas分组统计-groupby详解
数据分组
分组统计 - groupby功能
①根据某些条件将数据拆分成组
②对每个组独⽴应⽤函数
③将结果合并到⼀个数据结构中
Dataframe在⾏(axis=0)或列(axis=1)上进⾏分组,将⼀个函数应⽤到各个分组并产⽣⼀个新值,然后函数执⾏结果被合并到最终的结果对象中。
注:因为输出结果冗长,请读者⾃⾏赋值粘贴到jupyter(推荐)中运⾏。欢迎评论交流
分组
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
print(df)
print('------')
upby('A'), upby('A')))
print('------')
# 直接分组得到⼀个groupby对象,是⼀个中间数据,没有进⾏计算
a = df.groupby('A').mean()
b = df.groupby(['A','B']).mean()
c = df.groupby(['A'])['D'].mean()  # 以A分组,算D的平均值
print("-----------------")
print(a,type(a),'\n',a.columns)
print()
print(b,type(b),'\n',b.columns)
print()
print(c,type(c))
# 通过分组后的计算,得到⼀个新的dataframe
# 默认axis = 0,以⾏来分组
# 可单个或多个([])列分组
#按A列分组求出A,B列的个数
groupby分组
grouped = df.groupby(["A"])
n = grouped.agg({"A": ["count", pd.Series.unique], "B": pd.Series.nunique})
print(n)
分组 - 可迭代对象
df = pd.DataFrame({'X' : ['A', 'B', 'A', 'B'], 'Y' : [1, 4, 3, 2]})
print(df)
upby('X'), upby('X')))
print('-----')
print(upby('X')), '→可迭代对象,直接⽣成list\n')
print(upby('X'))[0], '→以元祖形式显⽰\n')
for n,g upby('X'):
print(n)
print(g)
print('###')
print('-----')
# n是组名,g是分组后的Dataframe
upby(['X']).get_group('A'),'\n')
upby(['X']).get_group('B'),'\n')
print('-----')
# .get_group()提取分组后的组
grouped = df.groupby(['X'])
ups)
ups['A'])  # 也可写:df.groupby('X').groups['A'] print('-----')
# .groups:将分组后的groups转为dict
# 可以字典索引⽅法来查看groups⾥的元素
sz = grouped.size()
print(sz,type(sz))
print('-----')
# .size():查看分组后的长度
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'],                  'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],                  'C' : np.random.randn(8),
'D' : np.random.randn(8)})
print(df)
print()
upby(['A','B']))
print()
grouped = df.groupby(['A','B']).groups
print(grouped)
print()
print(grouped[('foo', 'three')])
# 按照两个列进⾏分组
其他轴上的分组
import pandas as pd
import numpy as np
df = pd.DataFrame({'data1':np.random.rand(2),
'data2':np.random.rand(2),
'key1':['a','b'],
'key2':['one','two']})
print(df)
print(df.dtypes)
print("-------------")
upby(df.dtypes, axis=1))
print('-----')
print(upby(df.dtypes, axis=1)))
print()
for n,p upby(df.dtypes, axis=1):
print(n)
print()
print(p)
print('##')
# 按照值类型分列
通过字典或者Series分组
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['a','b','c','d'])
print(df)
print('-----')
mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}
by_column = df.groupby(mapping, axis = 1)
print(by_column.sum())
print('-----')
# mapping中,a、b列对应的为one,c、d列对应的为two,以字典来分组
s = pd.Series(mapping)
print(s,'\n')
upby(s).count())
# s中,index中a、b对应的为one,c、d对应的为two,以Series来分组
通过函数分组
df = pd.DataFrame(np.arange(16).reshape(4,4),
columns = ['a','b','c','d'],
index = ['abc','bcd','aa','b'])
print(df,'\n')
upby(len).sum())
# 按照字母长度分组
分组计算函数⽅法
s = pd.Series([1, 2, 3, 10, 20, 30], index = [1, 2, 3, 1, 2, 3])
grouped = s.groupby(level=0)  # 唯⼀索引⽤.groupby(level=0),将同⼀个index的分为⼀组print(grouped)
print(grouped.first(),'→ first:⾮NaN的第⼀个值\n')
print(grouped.last(),'→ last:⾮NaN的最后⼀个值\n')
print(grouped.sum(),'→ sum:⾮NaN的和\n')
an(),'→ mean:⾮NaN的平均值\n')
dian(),'→ median:⾮NaN的算术中位数\n')
unt(),'→ count:⾮NaN的值\n')
print(grouped.min(),'→ min、max:⾮NaN的最⼩值、最⼤值\n')
print(grouped.std(),'→ std,var:⾮NaN的标准差和⽅差\n')
print(grouped.prod(),'→ prod:⾮NaN的积\n')
多函数计算:agg()
df = pd.DataFrame({'a':[1,1,2,2],
'b':np.random.rand(4),
'c':np.random.rand(4),
'd':np.random.rand(4),})
print(df)
upby('a').agg(['mean',np.sum]))
upby('a')['b'].agg({'result1':np.mean,
'result2':np.sum}))
# 函数写法可以⽤str,或者np.⽅法
# 可以通过list,dict传⼊,当⽤dict时,key名为columns
下⾯是⼀个测试题,⼤家可以尝试⼀下 按要求创建Dataframe df(如下图),并通过分组得到以下结果
①以A分组,求出C,D的分组平均值
②以A,B分组,求出D,E的分组求和
③以A分组,得到所有分组,以字典显⽰
④按照数值类型分组,求和
⑤将C,D作为⼀组分出来,并计算求和
⑥以B分组,求出每组的均值,求和,最⼤值,最⼩值
import pandas as pd
import numpy as np
df = pd.DataFrame({"A":["one","two","three","one","two","three","one","two"],
"B":(list("hhhh") + list("ffff")),
"C":range(10,26,2),
"D":np.random.randn(8),
"E":np.random.rand(8)
})
print(df)
print("----------以A分组,求出CD的分组平均值-------------")
upby(["A"], axis = 0)["C","D"])
df1 = df.groupby(["A"], axis = 0)["C","D"].mean()  # 先聚合
print(df1)
print("-----------以AB分组,求DE的分组和--------")
df2 = df.groupby(["A", "B"], axis = 0)["D","E"].sum()  # 先聚合
print(df2)
print("-----------以A分组,得到所有分组的字典--------")
df2 = df.groupby(["A"], axis = 0)
ups)
print("按照数值类型分组,求和")
df3 = df.groupby(df.dtypes, axis = 1).sum()
print(df3)
print("----------将CD作为⼀组分出来,并计算求和-----------")
mapping = {"C":"one", "D":"one"}
upby(mapping, axis = 1).sum())
print("------------以B分组,求每⼀组的均值、和、最⼤值、最⼩值-----------------------------------------------------") upby(["B"]).agg([np.mean, np.sum, np.max, np.min]))

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。