pandas札记12_数据聚合和分组运算

浏览: 1012

Pandas中提供了灵活的分组功能,通过groupby实现,对数据进行切片、切块、合并等操作

  • 计算分组摘要:计数、平均值、标准差,用户自定义函数
  • 组内变换或者其他运算,规格化、线性回归、排名或选取子集等
  • 计算透视表、交叉表等
  • 执行分位数和其他统计分组分析

groupby机制

分组运算术语:拆分---应用---合并

  • 拆分:根据提供的键进行拆分,操作在特定的轴上进行;axis=0表示行,axis=1表示列
  • 应用:将函数应用(apply)到各个分组上面,产生新的值
  • 合并:将函数执行对象的新的值combine到最终的结果对象中

image.png

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 创建数据
df = pd.DataFrame({'key1' : ['a', 'a', 'b', 'b', 'a'],
'key2' : ['one', 'two', 'one', 'two', 'one'],
'data1' : np.random.randn(5),
'data2' : np.random.randn(5)})
df

image.png

# 变量grouped是⼀个GroupBy对象,存储了分组键df["key1"]的中间数据
# 将data1的数据按照key1进行分组
grouped = df['data1'].groupby(df['key1'])
grouped

由groupby方法产生的是个GroupBy对象,可以进行任何DF操作

image.png

# 通过两个键进行分组,得到S的层次化索引
# 分组键均为S;分组键可以是任何长度适当的数组
means = df['data1'].groupby([df['key1'], df['key2']]).mean()
means

means.unstack()

image.png

states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
# 对data1的数据通过states、years
df['data1'].groupby([states, years]).mean()

image.png

image.png

对分组进行迭代

利用for对分组结果进行迭代:

for name, group in df.groupby('key1'):
print(name)
print(group)

# 结果
a
key1 key2 data1 data2
0 a one 0.929721 -1.281824
1 a two 1.437029 0.471776
4 a one 0.129513 1.108706
b
key1 key2 data1 data2
2 b one 1.431398 -1.136894
3 b two -1.014708 -0.089907

image.png

# 分组数据进行任何操作,做成字典形式
pieces = dict(list(df.groupby('key1')))
pieces['b']

# groupby默认是在axis=0上分组
grouped = df.groupby(df.dtypes, axis=1)
for dtype, group in grouped:
print(dtype)
print(group)

image.png

通过字典或者Series分组

people = pd.DataFrame(np.random.randn(5, 5),
columns=['a', 'b', 'c', 'd', 'e'],
index=['Joe', 'Steve', 'Wes', 'Jim', 'Travis'])
people.iloc[2:3, [1, 2]] = np.nan

image.png

map_series = pd.Series(mapping)
map_series

people.groupby(map_series, axis=1).count()

image.png

image.png

image.png

apply方法使用

  • 将待处理的对象拆分成多个片段
  • 各个片段调用传入的函数
  • 将各个片段组合在一起

image.png

fillna填充

  • dropna能够用于填充
  • fillna()能够填充指定值
s = pd.Series(np.random.randn(6))
s[::2] = np.nan
s

image.png

  • 针对一个列进行填充
# 缺失值填充为整个数据的平均值
s.fillna(s.mean())

image.png

  • 针对多个列进行填充
states = ['Ohio', 'New York', 'Vermont', 'Florida',
'Oregon', 'Nevada', 'California', 'Idaho']
group_key = ['East'] * 4 + ['West'] * 4
group_key

image.png

  • 利用分组的平均值进行填充
# 用分组平均值填充NA值
fill_mean = lambda g: g.fillna(g.mean())
data.groupby(group_key).apply(fill_mean)

缺失值填充

# 设置缺失值
data[['Vermont', 'Nevada', 'Idaho']] = np.nan
data

data.groupby(group_key).mean()

image.png

![image.png](https://upload-images.jianshu.io/upload_images/5142014-459ae80eca306431.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

# 预定义填充值
fill_values = {'East': 0.5, 'West': -1}
# 分组中的name属性
fill_func = lambda g: g.fillna(fill_values[g.name])
# 调用apply函数
data.groupby(group_key).apply(fill_func)

image.png

透视表pivot table

  • 根据一个或者多个键对数据进行聚合
  • 根据行和列上的分组键将数据分配到各个矩形区域
  • groupby+reshape重塑功能实现透视表
  • DFpivot_table实现:默认聚合类型是计算分组平均数

交叉表crosstab

  • crosstab的前两个参数可以是数组或Series,或是数组列表
  • 对数据计算分组频率的透视表

image.png

推荐 0
本文由 皮大大 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册