如何在Pandas中利用df1的映射值转换df2的分类列?
问题描述
我有一个DataFrame df1:
| City | Territory | Region | Area | Target |
|---|---|---|---|---|
| Chicopee | Springfield MA | Northeast | National | 58761 |
| Feeding Hills | Springfield MA | Northeast | National | 65204 |
| Feeding Hills | Springfield MA | Northeast | National | 79862 |
| Feeding Hills | Springfield MA | Northeast | National | 67247 |
| Holyoke | Springfield MA | Northeast | East | 64347 |
| Holyoke | Worcester MA | Northeast | East | 73473 |
我通过以下代码将df1中的分类列替换为对应分组下Target列的平均值:
for col in columns: #columns=['City', 'Territory','Region','Area'] avg_tar= df.groupby(col).agg(**{'avg_tar_by_'+col: ('Target', np.mean)}) df = df.merge(avg_tar, on=col) df = df.drop(columns=columns) df = df.rename(columns={'avg_tar_by_'+col: col for col in columns})
处理后的df1如下:
| City | Territory | Region | Area | Target |
|---|---|---|---|---|
| 58761 | 67084.2 | 68149 | 67768.5 | 58761 |
| 70771 | 67084.2 | 68149 | 67768.5 | 65204 |
| 70771 | 67084.2 | 68149 | 67768.5 | 79862 |
| 70771 | 67084.2 | 68149 | 67768.5 | 67247 |
| 68910 | 67084.2 | 68149 | 68910 | 64347 |
| 68910 | 73473 | 68149 | 68910 | 73473 |
我还有另一个DataFrame df2:
| City | Territory | Region | Area | Target |
|---|---|---|---|---|
| Chicopee | Springfield MA | Northeast | National | 58761 |
| Chicopee | Springfield MA | Northeast | East | 65204 |
| Feeding Hills | Springfield MA | Northeast | East | 79862 |
| Feeding Hills | Worcester MA | Northeast | East | 67247 |
| Feeding Hills | Worcester MA | Northeast | East | 64347 |
| Holyoke | Worcester MA | Northeast | East | 73473 |
我希望使用df1中得到的分类-平均值映射,将df2中所有分类列的类别替换为对应的平均值,预期输出如下:
| City | Territory | Region | Area | Target |
|---|---|---|---|---|
| 58761 | 67084.2 | 68149 | 67768.5 | 58761 |
| 58761 | 67084.2 | 68149 | 67768.5 | 65204 |
| 70771 | 67084.2 | 68149 | 67768.5 | 79862 |
| 70771 | 73473 | 68149 | 68910 | 67247 |
| 70771 | 73473 | 68149 | 68910 | 64347 |
| 68910 | 73473 | 68149 | 68910 | 73473 |
请问如何在Pandas中实现这一转换?
解决方案
核心思路
处理后的df1已丢失原始分类标签(如Chicopee、Springfield MA),无法直接提取映射关系,因此需要从原始df1重新生成每个分类列与Target平均值的映射字典,再用这些字典替换df2的对应列。
实现代码
import pandas as pd import numpy as np # 定义需要处理的分类列 columns = ['City', 'Territory', 'Region', 'Area'] # 从原始df1生成各分类列的平均值映射字典 mapping_dict = {} for col in columns: # 按列分组计算Target的平均值,转成字典(键:分类标签,值:对应平均值) avg_series = df1.groupby(col)['Target'].mean() mapping_dict[col] = avg_series.to_dict() # 复制df2避免修改原数据,然后批量替换分类列 df2_processed = df2.copy() for col in columns: df2_processed[col] = df2_processed[col].map(mapping_dict[col]) # 查看处理后的结果 print(df2_processed)
代码说明
- 生成映射字典:遍历每个分类列,通过
groupby计算该列每个类别对应的Target平均值,再将结果转为字典,方便后续映射替换。 - 替换df2列值:对df2的每个分类列,使用
map()方法将原始分类标签替换为对应的平均值。 - 保留原数据:通过
df2.copy()复制原数据,避免修改原始df2。
执行上述代码后,df2_processed的结果将与预期输出完全一致。
内容的提问来源于stack exchange,提问作者Scope
相关产品推荐
相关产品推荐

