pandas小技巧-groupby分组后的操作

欢迎关注本人公众号--交通数据探索师

1、保留每组某列值最大的行数据

可以用来求每组最大的几行数据,或者最小的几行数据,或者每组的第一、第三这种某几行数据

主要用到nth函数,该函数具体用法如下,

import pandas as pd """提取每个分组的第n行(从0开始)或最后n行(从-1开始) 只能跟在groupby之后使用 nth(n,dropna=None) n: 可以是一个整数或一个列表 dropna: None:不删除缺失值;any: 删除任何含有缺失值的行;all: 删除全是缺失值的行""" data = pd.DataFrame({'A': [1, 1, 1, 2, 2], 'B': list('abcde')}) data = data.groupby('A').nth([0, 1]) # 提取每个分组的第一行和第二行 data

保留每组某列最大的行数据,操作如下,

import pandas as pd data = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b'], 'value': [8, 9, 6, 12, 7, 9, 5]}) # 只保留每组value列值最大的行 data.sort_values(by=['group', 'value'], ascending=[False, False], inplace=True) data = data.groupby('group').nth[0] data

2、求每组的平均值

分组求每组的均值,求和、中位数、方差等操作同理。

import pandas as pd data = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b'], 'value': [8, 9, 6, 12, 7, 9, 5]}) # 分组求均值 data['mean_value'] = data.groupby('group')['value'].transform(lambda x: x.mean()) data

3、分组标记序号

import pandas as pd data = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b'], 'value': [8, 9, 6, 12, 7, 9, 5]}) # 分组后,对每一组按照某列的值标记序号 data.sort_values(by=['group', 'value'], ascending=[False, False], inplace=True) # 通过累计计数,标记序号 data['rank'] = (data.groupby('group').cumcount() + 1).astype(str) data

4、分组填充空值

使用前一个值或者后一个值作为填充策略

import pandas as pd import numpy as np data = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b'], 'value': [8, 9, np.NAN, np.NAN, 7, np.NAN, 5]}) # 每一组的value列先按照前一个非空值填充,如果前一个不是非空值,则按照后一个非空值填充 data = data.assign(value = data.groupby('group')['value'].ffill().bfill()) data

使用每组非空值的平均值进行填充

import pandas as pd import numpy as np data = pd.DataFrame({'group': ['a', 'a', 'a', 'a', 'b', 'b', 'b'], 'value': [8, 9, np.NAN, np.NAN, 7, np.NAN, 5]}) # 使用每组非空值的均值填充每组的空值 # 首先求出每组非空值的均值赋给mean_value列 data['mean_value'] = data.groupby('group')['value'].transform(lambda x: x.mean()) # 然后使用mean_value列对应的非空值填充value列对应的空值 data['value'] = data['value'].fillna(data['mean_value']) data

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

煮雨小筑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值