Python数据分析分组统计groupby

Posted 奔跑的金鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析分组统计groupby相关的知识,希望对你有一定的参考价值。


分组统计groupby功能:

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

1.语法

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的主要内容,如果未能解决你的问题,请参考以下文章

python pandas groupby分组后的数据怎么用

Python分组

python数据分析之Dataframe分组(group by)

python 用groupby之后生成新的数据框

数据分析—Pandas 中的分组聚合Groupby 高阶操作

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用agg函数计算每个分组不同数值变量的聚合统计值agg参数为字典指定不同变量的聚合计算统计量的形式