[英]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']
為0
和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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.