Python根据另一个数据帧值中的列索引填充数据帧值

Python根据另一个数据帧值中的列索引填充数据帧值,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧,如下所示: 数据帧df1: id val1 val2 val3 val4 val5 abc 0.0 1.0 4.0 3.0 4.0 dsssd 0.0 1.0 1.0 1.0 1.0 dsd 0.0 4.0 7.0 另一个数据帧df2: id val1 val2 val3 val4 val5 abc 88 76 55 43 21 dsssd 92.4 21.3 22 45 49 dsd 22.3 87.2 78.2

我有两个数据帧,如下所示: 数据帧df1:

id  val1    val2    val3    val4    val5
abc 0.0 1.0 4.0 3.0 4.0
dsssd   0.0 1.0 1.0 1.0 1.0
dsd 0.0 4.0 7.0 
另一个数据帧df2:

id  val1    val2    val3    val4    val5
abc 88 76 55 43 21
dsssd   92.4 21.3 22 45 49
dsd 22.3 87.2 78.2
df1包含列索引作为值。我想创建df3,它具有来自df2的相应索引值。 预期成果df3:

id  val1    val2    val3    val4    val5
abc 88  76  21  43  21
dsssd   92.4    21.3    21.3    21.3    21.3
dsd 22.3    nan nan 
我已经研究了df.lookup和iloc,但不知道如何实现它。我仍在寻找解决办法。同时我把它贴在这里,如果有人知道它是怎么做的

import pandas as pd
import numpy as np

df1= pd.DataFrame({'id': ['abs', 'dssd', 'dsd'],
                   'val1': [0.0, 0.0, 0.0],
                   'val2': [1.0, 1.0, 4.0],
                   'val3': [4.0, 1.0, 7.0],
                   'val4': [3.0, 1.0, np.nan],
                   'val5': [4.0, 1.0, np.nan]})


df2= pd.DataFrame({'id': ['abs', 'dssd', 'dsd'],
                   'val1': [88.0, 92.4, 22.3],
                   'val2': [76.0, 21.3, 87.2],
                   'val3': [55.0, 22.0, 78.2],
                   'val4': [43.0, 45.0, np.nan],
                   'val5': [21.0, 49.0, np.nan]})
谢谢

使用合并

您可以使用with进行重塑、添加计数器列by、左连接by和最后旋转by,更改顺序为
id
by:

pd.merge(df1, df2, how='outer', left_on='id', right_on='id',
         left_index=False, right_index=False, sort=True,
         suffixes=('_x', '_y'), copy=True, indicator=False,
         validate=None)
df11 = df1.set_index('id').stack().rename_axis(index=['id','v']).reset_index(name='idx')
# print (df11)

df22 = df2.set_index('id').stack().rename_axis(index=['id','v']).reset_index(name='val')
df22['idx'] = df22.groupby('id').cumcount()
# print (df22)


df = (df11.merge(df22, on=['id','idx'], how='left')
          .pivot(index='id', columns='v_x', values='val')
          .reindex(df1['id'])
          .rename_axis(None, axis=1)
          .reset_index()
          )
print (df)
     id  val1  val2  val3  val4  val5
0   abs  88.0  76.0  21.0  43.0  21.0
1  dssd  92.4  21.3  21.3  21.3  21.3
2   dsd  22.3   NaN   NaN   NaN   NaN