pandas 分组操作

pandas分组

1.分组统计

import numpy as np
import pandas as pd

# 准备数据
df = pd.DataFrame(data={'sex': np.random.randint(0, 2, size=300),  # 0男,1⼥
                        'class': np.random.randint(1, 9, size=300),  # 1~8⼋个班
                        'Python': np.random.randint(0, 151, size=300),  # Python成绩
                        'Keras': np.random.randint(0, 151, size=300),  # Keras成绩
                        'Tensorflow': np.random.randint(0, 151, size=300),
                        'Java': np.random.randint(0, 151, size=300),
                        'C++': np.random.randint(0, 151, size=300)})

df['sex'] = df['sex'].map({0: '男', 1: '⼥'})  # 将0,1映射成男⼥

# 1、分组->可迭代对象
# 1.1 先分组再获取数据
g = df.groupby(by='sex')[['Python', 'Java']]  # 单分组
for name, data in g:
    print('组名:', name)
    print('数据:', data)
df.groupby(by=['class', 'sex'])[['Python']]  # 多分组

# 1.2 对⼀列值进⾏分组
df['Python'].groupby(df['class'])  # 单分组
df['Keras'].groupby([df['class'], df['sex']])  # 多分组

# 1.3 按数据类型分组
df.groupby(df.dtypes, axis=1)

# 1.4 通过字典进⾏分组
m = {'sex': 'category', 'class': 'category', 'Python': 'IT', 'Keras': 'IT', 'Tensorflow': 'IT', 'Java': 'IT', 'C++': 'IT'}
for name, data in df.groupby(m, axis=1):
    print('组名', name)
    print('数据', data)

2.分组聚合

2.1 分组直接调⽤函数进⾏聚合

# 按照性别分组,其他列均值聚合
df.groupby(by = 'sex').mean().round(1) # 保留1位⼩数

# 按照班级和性别进⾏分组,Python、Keras的最⼤值聚合
df.groupby(by = ['class','sex'])[['Python','Keras']].max()

# 按照班级和性别进⾏分组,计数聚合。统计每个班,男⼥⼈数
df.groupby(by = ['class','sex']).size()

# 基本描述性统计聚合
df.groupby(by = ['class','sex']).describe()

2.2 分组后调⽤apply,transform封装单⼀函数计算

# 返回分组结果
df.groupby(by = ['class','sex'])[['Python','Keras']].apply(np.mean).round(1)

# 返回全数据,返回DataFrame.shape和原DataFrame.shape⼀样。
def normalization(x):
	return (x - x.min())/(x.max() - x.min()) # 最⼤值最⼩值归⼀化
df.groupby(by = ['class','sex'])[['Python','Tensorflow']].transform(normalization).round(3)

2.3 agg 多种统计汇总操作

# 分组后调⽤agg应⽤多种统计汇总
df.groupby(by = ['class','sex'])[['Tensorflow','Keras']].agg([np.max,np.min,pd.Series.count])

# 分组后不同属性应⽤多种不同统计汇总
df.groupby(by = ['class','sex'])[['Python','Keras']].agg({'Python':[('最⼤值',np.max),('最⼩值',np.min)],
			'Keras':[('计 数',pd.Series.count),('中位数',np.median)]})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曾晶的总结

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值