pandas 连接2个 Dataframe 以获得输出

8cdiaqws  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(142)

使用下面的df1和df2,我希望创建df_new,其中包含来自df1的feat0、feat1和feat2,以及来自df2的相应值value_feat0、value_feat1和value_feat2。我还创建了df_new作为预期输出。

df1 = pd.DataFrame([['Age', 'Education-Num', 'Sex'],
                    ['Sex','Education-Num','Age'],
                    ['Education-Num','Age','Sex'],
                    ['Age', 'Education-Num', 'Sex'],
                    ['Age', 'Education-Num', 'Sex']],
                   columns=['feat0', 'feat1', 'feat2'])
df2 = pd.DataFrame([[39.0, 7, 13.0, 4, 1, 0, 4, 1, 2174.0, 0.0, 40.0, 39],
                    [50.0, 6, 13.0, 2, 4, 4, 4, 1, 0.0, 0.0, 13.0, 39],
                    [38.0, 4, 9.0, 0, 6, 0, 4, 1, 0.0, 0.0, 40.0, 39],
                    [53.0, 4, 7.0, 2, 6, 4, 2, 1, 0.0, 0.0, 40.0, 39],
                    [28.0, 4, 13.0, 2, 10, 5, 2, 0, 0.0, 0.0, 40.0, 5]],
                   columns=['Age', 'Workclass', 'EducationNum', 'MaritalStatus', 'Occupation',
                            'Relationship', 'Race', 'Sex', 'CapitalGain', 'CapitalLoss',  
                            'Hoursperweek', 'Country'])

预期产出:

df_new = pd.DataFrame([['Age', 39, 'EducationNum', 13, 'Sex', 1],
                       ['Sex',1, 'EducationNum',13, 'Age', 50],
                       ['EducationNum',9, 'Age',38, 'Sex', 1],
                       ['Age', 38, 'EducationNum', 7, 'Sex', 1],
                       ['Age', 28, 'EducationNum', 13, 'Sex', 0]],
                      columns=['feat0', 'value_feat0', 'feat1', 'value_feat1', 'feat2', 'value_feat2'])

我尝试使用melt()并合并 Dataframe ,但无法成功。

bd1hkmkf

bd1hkmkf1#

您可以在df1的列上使用for循环,然后使用此建议方法查找df2中的值:

df_new = pd.DataFrame()

for col in df1.columns:
    df_new[col] = df1[col]
    idx, cols = pd.factorize(df1[col])
    df_new['value_'+col] = df2.reindex(cols, axis=1).to_numpy()[np.arange(len(df2)), idx]

输出:

feat0           value_feat0     feat1           value_feat1     feat2   value_feat2
0   Age             39.0            Education-Num   13.0            Sex     1.0
1   Sex             1.0             Education-Num   13.0            Age     50.0
2   Education-Num   9.0             Age             38.0            Sex     1.0
3   Age             53.0            Education-Num   7.0             Sex     1.0
4   Age             28.0            Education-Num   13.0            Sex     0.0

或者,也可以使用不推荐使用的lookup方法(不推荐):

df_new = pd.DataFrame()

for col in df1.columns:
    df_new[col] = df1[col]
    df_new['value_'+col] = df2.lookup(df1[col].index, df1[col].values)

注意:我在df2中使用列名Education-Num是为了与df1保持一致。

相关问题