簡體   English   中英

合並兩個具有附加條件的數據框

[英]Merging two dataframes with an added condition

我有兩個數據框,需要按照以下步驟進行合並:

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'列,根據'Speed'列和對象'Type'顯示'Fast''Slow'列中的時間。 我真的不知道該怎么做,所以任何幫助將不勝感激! 提前致謝。 抱歉造成混亂的解釋。

使用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 -由set_index使用numpy.where創建的Series map 。其中numpy.where df1['Speed']01 ,諸如FalseTrue的過程也是如此:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM