[英]Combine two data-frames on conditions
問題:
我有兩個表,下面有示例輸入:
基線_汽車:
姓名 | 名稱 | FW_Base | 序列 | FP_Base | FW_Prop | FP_Prop | 已更改 | 更改類型 |
---|---|---|---|---|---|---|---|---|
奧迪 | A1 | 2 | 0 | 2 | 0 | 0 | 0 | “” |
奧迪 | A2 | 3 | 0 | 3 | 0 | 0 | 0 | “” |
奧迪 | A3 | 4 | 0 | 4 | 0 | 0 | 0 | “” |
寶馬 | X1 | 5 | 0 | 5 | 0 | 0 | 0 | “” |
寶馬 | X2 | 6 | 0 | 6 | 0 | 0 | 0 | “” |
默克 | M4 | 7 | 0 | 7 | 0 | 0 | 0 | “” |
默克 | M5 | 8 | 0 | 8 | 0 | 0 | 0 | “” |
提議_汽車:
1 | 2 | 3 | 4(FW_Base) | 5(FW_Prop) | 6(FP_Base) | 7(FP_Prop) | 8(已更改) | 9(更改類型) |
---|---|---|---|---|---|---|---|---|
144 | 奧迪 | A1 | 2 | 1 | 1 | 1 | 1 | W |
144 | 奧迪 | A2 | 3 | 3 | 3 | 1 | 1 | 磷 |
144 | 寶馬 | X1 | 5 | 3 | 3 | 3 | 1 | W |
144 | 寶馬 | X2 | 6 | 4 | 4 | 4 | 1 | W |
預期解決方案:
1 | 2 | 3 | 4(FW_Base) | 5(FW_Prop) | 6(FP_Base) | 7(FP_Prop) | 8(已更改) | 9(更改類型) |
---|---|---|---|---|---|---|---|---|
144 | 奧迪 | A1 | 2 | 1 | 1 | 1 | 1 | W |
144 | 奧迪 | A2 | 3 | 3 | 3 | 1 | 1 | 磷 |
144 | 奧迪 | A3 | 4 | 0 | 4 | 0 | 0 | NULL |
144 | 寶馬 | X1 | 5 | 3 | 3 | 3 | 1 | W |
144 | 寶馬 | X2 | 6 | 4 | 4 | 4 | 1 | W |
預期解決方案的說明:
基線汽車包含汽車品牌的名稱,帶有 Fnames、基線權重(FW_Base)、基線參數(FP_Base)。
提議的汽車包含具有提議的新權重 (FW_PROP) 和新參數 (FP_PROP) 的汽車名稱。
默認情況下,基線汽車中的 FW_PROP、FP_PROP、isChanged 為 0,changeType 列為空字符串。
isChanged=1 in Proposed cars 表示已建議新的權重或參數(如果 changeType = W,新的權重更改或 changeType=P,新的參數更改)
我希望合並表的條件是,如果Proposed cars 中的 Fname 存在於 Baseline cars 中,我們替換 Baseline_Cars 中的相應列,並為 changeType 輸入 NULL 以防萬一沒有進行任何更改。 (如奧迪A3排)
生成上述示例輸入數據的代碼段:
baseline_cars = pd.DataFrame(columns=['Name','Fname','FW_Base','Seq','FP_Base','FW_Prop','FP_Prop','isChanged','ChangeType'])
proposed_cars = pd.DataFrame(columns=['1','2','3','4(FW_Base)','5(FW_Prop)','6(FP_Base)','7(FP_Prop)','8(isChanged)','9(ChangeType)'])
baseline_cars = baseline_cars.append({'Name':'Audi','Fname':'A1','FW_Base':2,'Seq':0,'FP_Base':2,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'Audi','Fname':'A2','FW_Base':3,'Seq':0,'FP_Base':3,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'Audi','Fname':'A3','FW_Base':4,'Seq':0,'FP_Base':4,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'BMW','Fname':'X1','FW_Base':5,'Seq':0,'FP_Base':5,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'BMW','Fname':'X2','FW_Base':6,'Seq':0,'FP_Base':6,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'Merc','Fname':'M4','FW_Base':7,'Seq':0,'FP_Base':7,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
baseline_cars = baseline_cars.append({'Name':'Merc','Fname':'M5','FW_Base':8,'Seq':0,'FP_Base':8,'FW_Prop':0,'FP_Prop':0,'isChanged':0,'ChangeType':""}, ignore_index=True)
proposed_cars = proposed_cars.append({'1':144,'2':'Audi','3':'A1','4(FW_Base)':2,'5(FW_Prop)':1,'6(FP_Base)':1,'7(FP_Prop)':1,'8(isChanged)':1,'9(ChangeType)':"W"}, ignore_index=True)
proposed_cars = proposed_cars.append({'1':144,'2':'Audi','3':'A2','4(FW_Base)':3,'5(FW_Prop)':3,'6(FP_Base)':3,'7(FP_Prop)':1,'8(isChanged)':1,'9(ChangeType)':"P"}, ignore_index=True)
proposed_cars = proposed_cars.append({'1':144,'2':'BMW','3':'X1','4(FW_Base)':5,'5(FW_Prop)':3,'6(FP_Base)':3,'7(FP_Prop)':3,'8(isChanged)':1,'9(ChangeType)':"W"}, ignore_index=True)
proposed_cars = proposed_cars.append({'1':144,'2':'BMW','3':'X2','4(FW_Base)':6,'5(FW_Prop)':4,'6(FP_Base)':4,'7(FP_Prop)':4,'8(isChanged)':1,'9(ChangeType)':"W"}, ignore_index=True)
檢查下面的代碼,共享原始數據也用於清晰(在問題中共享之前創建它)
import pandas as pd
import numpy as np
Baseline_Cars = pd.DataFrame({'Name':['Audi','Audi','Audi','BMW','BMW','Merc','Merc',],
'Fname':['A1','A2','A3','X1','X2','M4','M5',],
'FW_Base':['2','3','4','5','6','7','8',],
'Seq':['0','0','0','0','0','0','0',],
'FP_Base':['2','3','4','5','6','7','8',],
'FW_Prop':['0','0','0','0','0','0','0',],
'FP_Prop':['0','0','0','0','0','0','0',],
'isChanged':['0','0','0','0','0','0','0',],
'changeType':["","","","","","","",]
})
Proposed_Cars = pd.DataFrame({'1':['144','144','144','144',],
'2':['Audi','Audi','BMW','BMW',],
'3':['A1','A2','X1','X2',],
'4(FW_Base)':['2','3','5','6',],
'5(FW_Prop)':['1','3','3','4',],'6(FP_Base)':['1','3','3','4',],
'7(FP_Prop)':['1','1','3','4',],'8(isChanged)':['1','1','1','1',],
'9(changeType)':['W','P','W','W',]})
merged_df = pd.merge(Baseline_Cars,Proposed_Cars, left_on=['Name','Fname'], right_on = ['2','3'], how='left' )
merged_df = merged_df[merged_df['Name'].isin(Proposed_Cars['2'].tolist())]
merged_df = merged_df.drop(['2','3'], axis=1).rename(columns={'Name':'2','Fname':'3'})
common_cols = [(j,i) for j in Proposed_Cars for i in Baseline_Cars if j.find(i)> -1]
merged_df[[i[0] for i in common_cols]] = merged_df.apply(lambda x: ','.join([x[i[1]] if (str(x[i[0]]) == 'nan') else x[i[0]] for i in common_cols]), axis=1).astype('str').str.split(',', expand=True)
merged_df[['1','2','3']+[i[0] for i in common_cols]].ffill().replace('',np.NaN)
Output:
更新 - 根據下面的 OP 評論,它適用於有問題的共享數據
merged_df = pd.merge(baseline_cars,proposed_cars, left_on=['Name','Fname'], right_on = ['2','3'], how='left' )
merged_df = merged_df[merged_df['Name'].isin(proposed_cars['2'].tolist())]
merged_df = merged_df.drop(['2','3'], axis=1).rename(columns={'Name':'2','Fname':'3'})
common_cols = [(j,i) for j in proposed_cars for i in baseline_cars if j.find(i)> -1]
merged_df[[i[0] for i in common_cols]] = merged_df.apply(lambda x: ','.join([ str(x[i[1]]) if (str(x[i[0]]) == 'nan') else str(x[i[0]]) for i in common_cols]), axis=1).astype('str').str.split(',', expand=True)
merged_df[[i[0] for i in common_cols][:-1]] = merged_df[[i[0] for i in common_cols][:-1]].astype('int')
merged_df[['1','2','3']+[i[0] for i in common_cols]].ffill().replace('',np.NaN)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.