我有两个数据帧需要合并,如下所示:
DF1
Name Type Speed
a x 1
a y 0
a z 1
DF2
Type Fast Slow
x 2 3
y 3 5
z 4 6
Df3 - 期望的结果
Name Type Speed Time
a x 1 2
a y 0 5
a z 1 4
所以基本上我需要创建一个新的'Time'
列,显示基于'Fast'
列和对象'Slow'
的'Speed'
或'Type'
列的时间。我真的不知道如何做到这一点所以任何帮助将不胜感激!提前致谢。抱歉令人困惑的解释..
使用merge
+ np.where
获得更简洁的解决方案:
v = df1.merge(df2, on=['Type'])
v['Time'] = np.where(v['Speed'], v.pop('Fast'), v.pop('Slow'))
Name Type Speed Time
0 a x 1 2
1 a y 0 5
2 a z 1 4
首先使用melt
进行重塑,然后使用map
进行正确匹配Speed
并使用左连接进行merge
:
df = df2.melt('Type', var_name='Speed', value_name='Time')
df['Speed'] = df['Speed'].map({'Fast':1, 'Slow':0})
print (df)
Type Speed Time
0 x 1 2
1 y 1 3
2 z 1 4
3 x 0 3
4 y 0 5
5 z 0 6
df3 = df1.merge(df, how='left', on=['Type','Speed'])
print (df3)
Name Type Speed Time
0 a x 1 2
1 a y 0 5
2 a z 1 4
如果表现很重要merge
不是必要的 - map
由Series
与set_index
创建的numpy.where
- df1['Speed']
是0
和1
,所以像False
s和True
s这样的过程:
s1 = df2.set_index('Type')['Fast']
s2 = df2.set_index('Type')['Slow']
df1['Time'] = np.where(df1['Speed'], df1['Type'].map(s1), df1['Type'].map(s2))
print (df1)
Name Type Speed Time
0 a x 1 2
1 a y 0 5
2 a z 1 4