使用具有不同标题名称的键将一个 DataFrame 的列值映射到另一个 DataFrame

数据挖掘 Python 熊猫 数据框
2021-10-09 06:38:57

我有两个数据框df1df2看起来像这样。

    cat1    cat2  cat3
0   10       25     12  
1   11       22     14
2   12       30     15

   all_cats  cat_codes
0   10       A     
1   11       B 
2   12       C
3   25       D
4   22       E
5   30       F
6   14       G

我想要一个 DataFrame,其中的每一列都df1被创建但替换为cat_codes. 列标题名称不同。我试过加入和合并,但我的行数不一致。我正在处理大量样本(100,000)。理想情况下,我的输出应该是这样的:

    cat1    cat2  cat3
0    A        D     C  
1    B        E     Y
2    C        F     Z

结果列应附加到df1.

2个回答

您可以转换df2为字典并使用它来替换中的值df1

cat_1 = [10, 11, 12]
cat_2 = [25, 22, 30]
cat_3 = [12, 14, 15]

df1 = pd.DataFrame({'cat1':cat_1, 'cat2':cat_2, 'cat3':cat_3})

all_cats = [10, 11, 12, 25, 22, 30, 15]
cat_codes = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

df2 = pd.DataFrame({'all_cats':all_cats, 'cat_codes':cat_codes})

rename_dict = df2.set_index('all_cats').to_dict()['cat_codes']

df1 = df1.replace(rename_dict)

如果您仍然有一些不在字典中的值并且想用 替换它们Z,则可以使用正则表达式来替换它们。

df1.astype('str').replace({'\d+': 'Z'}, regex=True)
df3 = pd.merge(df1,df2,left_on=['cat'+str(i)], right_on = ['cat_codes'], how = 'left')

我会为cat1、cat2和cat3迭代这个。这不会替换现有的列值,而是追加新列。