合并两个具有附加条件的数据框

时间:2018-08-29 06:35:39

标签: python pandas dataframe merge

我有两个数据帧,需要按照以下步骤进行合并:

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'列中的时间。我真的不知道该怎么做,所以任何帮助将不胜感激!提前致谢。抱歉,造成混淆的解释。

2 个答案:

答案 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不是必需的-mapset_index创建的Seriesdf1['Speed']-0为{{1 }}和1FalseTrue之类的进程也是如此:

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