Pandas分组和聚合操作(附带实例)
在 Pandas 中,利用 groupby() 函数可进行分组,groupby 对象没有进行实际运算,只是包含分组的中间数据。
【实例】利用 groupby() 函数对数据进行分组。
此外,还可以通过字典进行分组。例如,利用 groupby() 通过字典进行分组:
【实例】对数据进行聚合操作。
apply() 和 agg() 功能上差不多,apply() 常用来处理不同分组的缺失数据的填充和 top N 的计算,会产生层级索引。而 agg 可以同时传入多个函数,作用于不同的列。
例如:
【实例】利用 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