【Python数据分析】分组统计groupby

python

目录

  • 1.语法
  • 2.基础分组
  • 2.分组后可迭代对象操作
  • 3.按照轴类型进行分组
  • 4.通过字典或者Series进行分组
  • 5.通过函数分组
  • 6.分组后常用数值函数
  • 7.多函数计算


分组统计groupby功能:

  • 根据某些条件,将数据拆成组
  • 对每个组独立应用函数
  • 将结果合并到一个数据结构中

1.语法

python">Dataframe在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中。

df.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, **kwargs)

2.基础分组

import pandas as pd

import numpy as np

df = pd.DataFrame({'A':['Foo','Bar','Foo','Bar','Foo'],

'B':['one','two','three','one','two'],

'C':np.random.randn(5),

'D':range(5)

})

print(df)

print('------------')

print(df.groupby('A'),type(df.groupby('A'))) #此处得到的是一个groupby对象,并没有进行计算

print('------------')

# 对A分组

a = df.groupby('A').mean() # 按A列分组后并对C跟D列进行求平均

print(a)

print('------------')

# 先对A分组,再对B分组,然后计算其平均值

b = df.groupby(['A','B']).mean()

print(b)

# 对A分组,然后对D列求平均值

print('------------')

c = df.groupby(['A'])['D'].mean()

print(c)

print('------------')

# 默认axis=0,按行来分组

输出结果:

2.分组后可迭代对象操作

import pandas as pd

# 分组,可迭代对象

df = pd.DataFrame({'X':['A','B','A','B'],

'Y':[1,4,3,2]

})

print(df)

print(df.groupby('X'),type(df.groupby('X')))

print('----------------')

print(list(df.groupby('X')),'可迭代对象,直接生成list \n')

print(list(df.groupby('X'))[0],'以元组的形势展示 \n')

for n,g in df.groupby('X'):

print(n) # 组名

print(g) # 组后跟的DataFrame

print('******************')

print('------------------get_group()提取分组后的组--------------------')

print(df.groupby(['X']).get_group('A'),'\n')

print(df.groupby(['X']).get_group('B'),'\n')

print('-------------------')

# groups:将分组后的groups转为dict,可以字典索引方法来查看groups里的元素

grouped = df.groupby(['X'])

print(grouped.groups)

print(grouped.groups['A']) # 也可写:df.groupby('X').groups['A']

print('-------------------')

# size():查看分组后的长度

sz = grouped.size()

print(sz,type(sz))

print('-----')

# 按照两个列进行分组

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)})

grouped = df.groupby(['A','B']).groups

print(df)

print(grouped)

print(grouped[('foo', 'three')])

输出结果:

3.按照轴类型进行分组

# 按照轴类型进行分组

import pandas as pd

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('----------------------------')

for n,p in df.groupby(df.dtypes,axis=1):

print(n)

print(p)

print('*************')

输出结果:

4.通过字典或者Series进行分组

import pandas as pd

df = pd.DataFrame(np.arange(16).reshape(4,4), columns = ['a','b','c','d'])

print(df)

print('-------------------------')

# mapping中,a、b列对应的为one,c、d列对应的为two,以字典来分组

mapping = {'a':'one','b':'one','c':'two','d':'two','e':'three'}

by_column = df.groupby(mapping, axis = 1)

print(by_column.sum())

print('-------------------------')

# s中,index中a、b对应的为one,c、d对应的为two,以Series来分组

s = pd.Series(mapping)

print(s,'\n')

print(s.groupby(s).count())

输出结果:

5.通过函数分组

import pandas as pd 

df = pd.DataFrame(np.arange(16).reshape(4,4),

columns = ['a', 'b', 'c', 'd'],

index = ['abc', 'bcd', 'aa', 'b']

)

print(df,'\n')

# 按照字母长度分组,分组后求和

print(df.groupby(len).sum())

输出结果:

6.分组后常用数值函数

import pandas as pd

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')

print(grouped.mean(),'-------mean:非NaN的平均值 \n')

print(grouped.median(),'-------median:非NaN的算术中位数 \n')

print(grouped.count(),'-------count:非NaN的值 \n')

print(grouped.min(),'-------min、max:非NaN的最小值、最大值 \n')

print(grouped.std(),'-------std,var:非NaN的标准差和方差\ \n')

print(grouped.prod(),'-------prod:非NaN的积\n')

输出结果:

7.多函数计算

import pandas as pd

df = pd.DataFrame({'a':[1,1,2,2],

'b':[10,10,20,20],

'c':[100,100,200,200],

'd':[1000,1000,2000,2000]

})

print(df)

print('----------------------')

print(df.groupby('a').agg(['mean',np.sum])) # 即可以求平均数,也可以求和

print(df.groupby('a')['b'].agg({"mean","sum"}))

输出结果:

以上是 【Python数据分析】分组统计groupby 的全部内容, 来源链接: utcz.com/z/388891.html

回到顶部