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

如何借助第二个DataFrame为第一个DataFrame实现标签编码(不使用LabelEncoder)

问题:利用第二个DataFrame对第一个DataFrame实现标签编码

我有两个Pandas DataFrame:

第一个DataFrame定义如下:

l1=[123,345,546,245]
l2=["a","a","b","b"]
l3=["j","k","l","pp"]
l4=["m","n","m","n"]

df1=pd.DataFrame(list(zip(l1,l2,l3,l4)),columns=['id','X','Y','Z'])
df1.head()

第二个DataFrame定义:

l1=["X","X","Y","Y","Y","Y","Z","Z"]
l2=["a","b","j","k","l","pp","m","n"]
l3=["1","2","1","2","3","4","1","2"]

df2=pd.DataFrame(list(zip(l1,l2,l3)),columns=["labelnames","levels","labels"])
df2

需求是用第二个DataFrame为第一个DataFrame实现标签编码,曾尝试将df2转换为如下嵌套字典来替换df1的值:

encode_dict = {"X" : { "a":"1" , "b":"2"},
               "Y": {"j":"1","k":"2","l":"3", "pp":"4"},
               "Z" : {"m":"1","n":"2"}}

但未能生成正确的字典格式,最终希望得到如下目标DataFrame:

l1=[123,345,546,245]
l2=["1","1","2","2"]
l3=["1","2","3","4"]
l4=["1","2","1","2"]

df_target=pd.DataFrame(list(zip(l1,l2,l3,l4)),columns=['id','X','Y','Z'])
df_target.head()

解决方案

方法一:生成正确嵌套字典后替换

先从df2生成符合要求的嵌套字典,再用该字典替换df1对应列的值:

import pandas as pd

# 从df2生成目标嵌套字典
encode_dict = df2.groupby('labelnames').apply(
    lambda group: group.set_index('levels')['labels'].to_dict()
).to_dict()

# 对df1的X/Y/Z列进行替换
df_encoded = df1.copy()
df_encoded[['X', 'Y', 'Z']] = df_encoded[['X', 'Y', 'Z']].replace(encode_dict)

方法二:使用melt+merge+pivot(无需手动构造字典)

这种方法更适合数据量较大的场景,避免字典构造的额外开销:

import pandas as pd

# 将df1转为长格式,方便和df2匹配
df1_melted = df1.melt(id_vars='id', var_name='labelnames', value_name='levels')

# 和df2合并,获取对应的标签
merged_df = df1_melted.merge(df2, on=['labelnames', 'levels'], how='left')

# 转回宽格式,恢复原DataFrame结构
df_encoded = merged_df.pivot(
    index='id',
    columns='labelnames',
    values='labels'
).reset_index()
df_encoded.columns.name = None  # 移除列名的索引标识

两种方法最终得到的df_encoded都与目标DataFrame一致。


内容的提问来源于stack exchange,提问作者gizem cemile çelik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 18:55:35