问题描述
我是Python Pandas的新手,并且在一段时间内一直在解决以下问题。
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.stack
与Series.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