通过调用df2中列出的df1索引来创建数据框

问题描述

我是Python Pandas的新手,并且在一段时间内一直在解决以下问题。

以下数据帧df1值显示了与应调用的df2值相关的索引

              Name1        Name2 ...        Name160          Name161
0              62            18  ...          NaN               75
1              79            46  ...          NaN               5
2               3            26  ...          NaN               0

df2包含属于必须调用的索引的值。

              Name1         Name2  ...              Name160                 Name161
0             152.0         204.0  ...                NaN                    164.0
1             175.0         308.0  ...                NaN                    571.0
2             252.0         695.0  ...                NaN                    577.0
3             379.0         722.0  ...                NaN                    655.0
4             398.0         834.0  ...                NaN                    675.0
..              ...           ...  ...                ...                      ...
213             NaN           NaN  ...                NaN                      NaN
214             NaN           NaN  ...                NaN                      NaN
215             NaN           NaN  ...                NaN                      NaN
216             NaN           NaN  ...                NaN                      NaN
217             NaN           NaN  ...                NaN                      NaN

例如,df1在“名称161”列中显示值“ 0”。然后df3应该显示df2中列出的索引为0的值。在这种情况下为“ 164”。

到目前为止,我已经看到df3显示了df2的前三个值,但是当然那不是我想要达到的。

Input:

    df3 = df1*0
    for c in df1.columns:
          df3[c]= df2[c]
    print(df3)

Output:
        
                    Name1        Name2   ...              Name160                 Name161
        0           152.0         204.0  ...                NaN                    164.0
        1           175.0         308.0  ...                NaN                    571.0
        2           252.0         695.0  ...                NaN                    577.0

任何帮助将不胜感激,谢谢!

解决方法

DataFrame.stackSeries.reset_index一起使用来重塑两个DataFrame的形状,然后通过DataFrame.merge与左联接合并,最后由DataFrame.pivot进行透视:

#change index values for match by sample data in df2
print (df1)
   Name1  Name2  Name160  Name161
0      2      4      NaN        4
1      0    213      NaN      216
2      3      2      NaN        0

df11 = df1.stack().reset_index(name='idx')
df22 = df2.stack().reset_index(name='val')

df = (df11.merge(df22,left_on=['idx','level_1'],right_on=['level_0',how='left')
         .pivot('level_0_x','level_1','val')
         .reindex(df1.columns,axis=1)
         .rename_axis(None)
         )
print (df)
   Name1  Name2  Name160  Name161
0  252.0  834.0      NaN    675.0
1  152.0    NaN      NaN      NaN
2  379.0  695.0      NaN    164.0