Объединение двух фреймов данных с добавленным условием - PullRequest
0 голосов
/ 29 августа 2018

Я получил два кадра данных, которые мне нужно объединить следующим образом:

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 голосов
/ 29 августа 2018

Используйте 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
0 голосов
/ 29 августа 2018

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...