You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中利用df1的映射值转换df2的分类列?

问题描述

我有一个DataFrame df1:

CityTerritoryRegionAreaTarget
ChicopeeSpringfield MANortheastNational58761
Feeding HillsSpringfield MANortheastNational65204
Feeding HillsSpringfield MANortheastNational79862
Feeding HillsSpringfield MANortheastNational67247
HolyokeSpringfield MANortheastEast64347
HolyokeWorcester MANortheastEast73473

我通过以下代码将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如下:

CityTerritoryRegionAreaTarget
5876167084.26814967768.558761
7077167084.26814967768.565204
7077167084.26814967768.579862
7077167084.26814967768.567247
6891067084.2681496891064347
6891073473681496891073473

我还有另一个DataFrame df2:

CityTerritoryRegionAreaTarget
ChicopeeSpringfield MANortheastNational58761
ChicopeeSpringfield MANortheastEast65204
Feeding HillsSpringfield MANortheastEast79862
Feeding HillsWorcester MANortheastEast67247
Feeding HillsWorcester MANortheastEast64347
HolyokeWorcester MANortheastEast73473

我希望使用df1中得到的分类-平均值映射,将df2中所有分类列的类别替换为对应的平均值,预期输出如下:

CityTerritoryRegionAreaTarget
5876167084.26814967768.558761
5876167084.26814967768.565204
7077167084.26814967768.579862
7077173473681496891067247
7077173473681496891064347
6891073473681496891073473

请问如何在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)

代码说明

  1. 生成映射字典:遍历每个分类列,通过groupby计算该列每个类别对应的Target平均值,再将结果转为字典,方便后续映射替换。
  2. 替换df2列值:对df2的每个分类列,使用map()方法将原始分类标签替换为对应的平均值。
  3. 保留原数据:通过df2.copy()复制原数据,避免修改原始df2。

执行上述代码后,df2_processed的结果将与预期输出完全一致。


内容的提问来源于stack exchange,提问作者Scope

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:48:28