如何借助第二个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
相关产品推荐
相关产品推荐

