如何按分组基于字典重命名Pandas DataFrame的mag列值
按分组将mag列映射为mag-levelN格式的解决方案
问题场景
现有如下Pandas DataFrame:
import pandas as pd tempdf = pd.DataFrame({ 'class': ['a', 'a', 'a','a','a','a', 'b','b','b','b', 'b', 'b'], 'type': ['train', 'train', 'train','train', 'test','test', 'train','train','train','train','test','test'], 'mag': [15,15,8,8,15,8, 2,2,6,6,6,6] })
需要将mag列的数值按class+type分组后的相对级别重命名为mag-levelN格式(比如同一分组内数值大的对应level1,次大的对应level2)。直接使用全局replace会出现不同分组中相同mag值对应不同level的冲突,需通过分组处理解决。
解决方案
1. 定义映射生成函数
假设按数值降序分配级别(数值越大级别越高),先定义生成每组映射字典的函数:
def make_magnif_groups(mag_series): # 获取分组内唯一mag值并按降序排序 sorted_mags = sorted(mag_series.unique(), reverse=True) # 生成映射规则:mag值 -> mag-levelN return {mag: f'mag-level{i+1}' for i, mag in enumerate(sorted_mags)}
2. 分组替换mag值
使用groupby.apply对每个class+type分组单独处理,避免全局替换的冲突:
# 按class和type分组,对每组的mag列应用映射规则 tempdf['mag'] = tempdf.groupby(['class', 'type'])['mag'].apply( lambda x: x.map(make_magnif_groups(x)) ) # 查看结果 print(tempdf)
运行后输出结果:
class type mag 0 a train mag-level1 1 a train mag-level1 2 a train mag-level2 3 a train mag-level2 4 a test mag-level1 5 a test mag-level2 6 b train mag-level2 7 b train mag-level2 8 b train mag-level1 9 b train mag-level1 10 b test mag-level1 11 b test mag-level1
备选方法:生成映射表再合并
如果需要更直观的映射关系管理,可以先生成分组映射表,再和原DataFrame合并:
# 生成分组的唯一mag值集合 mapping_df = tempdf.groupby(['class', 'type'])['mag'].unique().reset_index() # 为每组生成映射字典 mapping_df['mag_mapping'] = mapping_df['mag'].apply(make_magnif_groups) # 展开映射表为每行对应一个mag值和其映射结果 mapping_df = mapping_df.explode('mag') mapping_df['mag_level'] = mapping_df.apply(lambda x: x['mag_mapping'][x['mag']], axis=1) # 合并原表与映射表,替换mag列 tempdf = tempdf.merge(mapping_df[['class', 'type', 'mag', 'mag_level']], on=['class', 'type', 'mag'], how='left') tempdf = tempdf.drop('mag', axis=1).rename(columns={'mag_level': 'mag'}) print(tempdf)
该方法同样能得到一致的结果,适合需要查看或调整分组映射规则的场景。
内容的提问来源于stack exchange,提问作者kas
相关产品推荐
相关产品推荐

