Python根据另一个数据帧值中的列索引填充数据帧值
我有两个数据帧,如下所示: 数据帧df1: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
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