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
ICP备案:
公安联网备案: