首页 > 编程笔记 > Python笔记 阅读:3

Pandas分组和聚合操作(附带实例)

在 Pandas 中,利用 groupby() 函数可进行分组,groupby 对象没有进行实际运算,只是包含分组的中间数据。

【实例】利用 groupby() 函数对数据进行分组。
import pandas as pd
import numpy as np
dict_obj = {'key1': ['a', 'b', 'a', 'b',
                    'a', 'b', 'a', 'a'],
           'key2': ['one', 'one', 'two', 'two',
                    'two', 'two', 'one', 'three'],
           'data1': np.random.randn(8),
           'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)
print(df_obj)
# dataframe 根据 key1 进行分组
print(type(df_obj.groupby('key1')))
# dataframe 的 data1 列根据 key1 进行分组
print(type(df_obj['data1'].groupby(df_obj['key1'])))
运行程序,输出如下:
    key1 key2     data1     data2
0     a   one  0.021990 -1.718190
1     b   one  2.394971  0.202758
2     a   two  0.389138  0.393872
3     b  three  0.865230 -0.226381
4     a  two -0.046788  1.599632
5     b  two -0.480741  0.691565
6     a  one -0.321899  1.914376
7     a  three -0.135662 -1.408881
<class 'pandas.core.groupby.groupby.DataFrameGroupBy'>
<class 'pandas.core.groupby.groupby.SeriesGroupBy'>

此外,还可以通过字典进行分组。例如,利用 groupby() 通过字典进行分组:
import pandas as pd
import numpy as np
# 通过字典分组
df_obj2 = pd.DataFrame(np.random.randn(1, 10, (5, 5)),
                      columns=['a', 'b', 'c', 'd', 'e'],
                      index=['A', 'B', 'C', 'D', 'E'])
mapping_dict = {'a':'Python', 'b':'Python', 'c':'Java', 'd':'C', 'e':'Java'}
print('-------------')
print(df_obj2)
print('-------------')
print(df_obj2.groupby(mapping_dict, axis=1).size())
print('-------------')
print(df_obj2.groupby(mapping_dict, axis=1).count())  # 非 NaN 的个数
print('-------------')
print(df_obj2.groupby(mapping_dict, axis=1).sum())
运行程序,输出如下:
-------------
a b c d e
A 7 7 4 1 1
B 5 7 5 7 5
C 1 5 1 7 3
D 8 4 3 9 9
E 1 3 1 4 1
-------------
C    1
Java  2
Python    2
dtype: int64
-------------
     C  Java  Python
A  1     0      2
B  1     2      2
C  1     2      2
D  1     2      2
E  1     2      2
-------------
     C  Java  Python
A  7     4     14
B  5    10     12
C  7     4      6
D  9    12     12
E  4     2      4

Pandas聚合操作

对于分组的某一列(行)或者多个列(行,axis=0/1),应用 agg(func) 可以对分组后的数据应用 func() 函数。例如,用 grouped['data1'].agg('mean') 即是对分组后的 'data1' 列求均值。当然也可以同时作用于多个列(行)和使用多个函数上。

【实例】对数据进行聚合操作。
from pandas import Series, DataFrame
df = DataFrame({'key1': ['a', 'a', 'b', 'b', 'a'],
                'key2': ['one', 'two', 'one', 'two', 'one'],
                'data1': np.random.randn(5),
                'data2': np.random.randn(5)})

grouped = df.groupby('key1')
print(grouped.agg('mean'))
运行程序,输出如下:
      data1     data2
key1
a   0.250546 -0.123191
b   0.578259 -0.849358

apply() 和 agg() 功能上差不多,apply() 常用来处理不同分组的缺失数据的填充和 top N 的计算,会产生层级索引。而 agg 可以同时传入多个函数,作用于不同的列。

例如:
df = DataFrame({'key1': ['a', 'a', 'a', 'b', 'b', 'a'],
                'key2': ['one', 'two', 'one', 'two', 'one', 'one'],
                'data1': np.random.randn(6),
                'data2': np.random.randn(6)})

grouped = df.groupby('key1')
print(grouped.agg(['sum', 'mean']))
print(grouped.apply(np.sum))
# apply() 在这里同样适用,只是不能传入多个参数,这两个函数基本是可以通用的
运行程序,输出如下:
       data1                data2               
         sum      mean       sum   mean
key1                                 
a  -1.954389 -0.651463  2.765482  0.921827
b  -0.757099 -0.378549 -1.281456 -0.640728
        key1      key2     data1     data2
key1                                 
a  aaa  onetwoone -1.954389 2.765482
b  bb      onetwo -0.757099 -1.281456

相关文章