欢迎关注本人公众号--交通数据探索师
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