2018.03.28 python-pandas groupby使用

mac2025-05-15  9

groupby 分组统计

1.根据某些条件将数据分组

2.对每个组独立应用函数

3.将结果合并到一个数据结构中

Dataframe在行或列上分组,将一个函数应用到各个分组并产生一个新值,然后函数执行结果被合并到最终的结果对象中

#分组 import numpy as npimport pandas as pddf = 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('------') print(df.groupby('A'),type(df.groupby('A'))) #直接分组得到的是groupby对象,是一个中间数据,没有进行计算 print(df.groupby('A').sum())#自动过滤字符串列 print(df.groupby('A').mean())#平均值 b = df.groupby(['A','B']).mean() print(b,type(b),'\n',b.columns) c = df.groupby(['A'])['D'].mean()#以A分组,取D列平均值 print(c,type(c),'\n')

结果:     A      B         C         D0  foo    one  0.429615 -0.7087821  bar    one  0.891751  1.1405752  foo    two -0.261858 -0.5168353  bar  three  1.310361  0.2696574  foo    two  1.048076  1.3742185  bar    two -0.410148  1.0611326  foo    one -1.124137 -0.7293677  foo  three  0.289513  0.892714------<pandas.core.groupby.DataFrameGroupBy object at 0x000000000FBACA58> <class 'pandas.core.groupby.DataFrameGroupBy'>            C         DA                      bar  1.791963  2.471364foo  0.381208  0.311947            C         DA                      bar  0.597321  0.823788foo  0.076242  0.062389                  C         DA   B                        bar one    0.891751  1.140575    three  1.310361  0.269657    two   -0.410148  1.061132foo one   -0.347261 -0.719074    three  0.289513  0.892714    two    0.393109  0.428691 <class 'pandas.core.frame.DataFrame'> Index(['C', 'D'], dtype='object')Abar    0.823788foo    0.062389Name: D, dtype: float64 <class 'pandas.core.series.Series'>

#分组 - 可迭代的对象 df = pd.DataFrame({'X':['A','B','A','B'],'Y':[1,3,4,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],'->以元组的形式显示') for n,g in df.groupby('X'): print(n) print(g) print('###') print('--------') #n是组名,g是分组后的DataFrame print(df.groupby(['X']).get_group('A'),'\n') print(df.groupby(['X']).get_group('B'),'\n') #.get_group提取分组后的组 grouped = df.groupby(['X']) print(grouped.groups) print(grouped.groups['A'])#也可写 df.groupby('X').groups['A'] print('-------') #.groups:将分组后的groups转化为dict #可以字典索引方法来查看groups里的元素 sz = grouped.size() print(sz,type(sz)) #.size() 查看分组后的长度 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']) dic=dict({'A':[1,2,3], 'B':[2,3,4]}) print(dic,type(dic))

结果:   X  Y0  A  11  B  32  A  43  B  2<pandas.core.groupby.DataFrameGroupBy object at 0x000000000F889F60> <class 'pandas.core.groupby.DataFrameGroupBy'>-------[('A',    X  Y0  A  12  A  4), ('B',    X  Y1  B  33  B  2)] ->可迭代对象,直接生成list('A',    X  Y0  A  12  A  4) ->以元组的形式显示A   X  Y0  A  12  A  4###B   X  Y1  B  33  B  2###--------   X  Y0  A  12  A  4    X  Y1  B  33  B  2 {'A': Int64Index([0, 2], dtype='int64'), 'B': Int64Index([1, 3], dtype='int64')}Int64Index([0, 2], dtype='int64')-------XA    2B    2dtype: int64 <class 'pandas.core.series.Series'>---------     A      B         C         D0  foo    one -0.881923 -0.8251021  bar    one -0.626412 -0.6186382  foo    two -1.741248  1.5576983  bar  three  1.076928  1.7382654  foo    two -0.954103 -0.7414155  bar    two  1.224841 -0.4794726  foo    one  0.680046 -0.4761377  foo  three -1.519952 -0.421738{('bar', 'one'): Int64Index([1], dtype='int64'), ('bar', 'three'): Int64Index([3], dtype='int64'), ('bar', 'two'): Int64Index([5], dtype='int64'), ('foo', 'one'): Int64Index([0, 6], dtype='int64'), ('foo', 'three'): Int64Index([7], dtype='int64'), ('foo', 'two'): Int64Index([2, 4], dtype='int64')}Int64Index([7], dtype='int64'){'A': [1, 2, 3], 'B': [2, 3, 4]} <class 'dict'>

#其他轴上分组 df = pd.DataFrame({'data1':np.random.randn(2), 'data2':np.random.randn(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('##') #按照值类型分组,分为2组

结果:      data1     data2 key1 key20  0.813374  0.232957    a  one1 -0.213256  1.393156    b  twodata1    float64data2    float64key1      objectkey2      objectdtype: object--------float64      data1     data20  0.813374  0.2329571 -0.213256  1.393156##object  key1 key20    a  one1    b  two##

#通过字典或者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'} print(mapping) 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) print(s.groupby(s).count()) #s中,index = a,b对应的是one;c,d对应的是two,以Series来分组

结果:    a   b   c   d0   0   1   2   31   4   5   6   72   8   9  10  113  12  13  14  15-------{'a': 'one', 'b': 'one', 'c': 'two', 'd': 'two', 'e': 'three'}   one  two0    1    51    9   132   17   213   25   29---------a      oneb      onec      twod      twoe    threedtype: objectone      2three    1two      2dtype: int64

 

最新回复(0)