我有两个数据帧,需要按照以下步骤进行合并:
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'
列中的时间。我真的不知道该怎么做,所以任何帮助将不胜感激!提前致谢。抱歉,造成混淆的解释。
答案 0 :(得分:2)
使用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
答案 1 :(得分:1)
首先使用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
与set_index
创建的Series
由df1['Speed']
-0
为{{1 }}和1
,False
和True
之类的进程也是如此:
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