條件

2017-09-15 40 views
0

合併3個dataframes我有一個數據幀DF條件

id value 
1 100 
2 200 
3 500 
4 600 
5 700 
6 800 

我還有一個數據幀DF2

c_id flag 
2  Y 
3  Y 
5  Y 

同樣DF3

c_id flag 
1  N 
3  Y 
4  Y 

我想合併這3個dataframes創造df 中的列使得我的df看起來像:

id value flag 
1 100  N 
2 200  Y 
3 500  Y 
4 600  Y 
5 700  Y 
6 800  nan 

我不希望使用DF2和DF3級聯

爲如(

final = pd.concat([df2,df3],ignore_index=False) 
final.drop_duplicates(inplace=True) 

我不想用這個方法,還有沒有其他的辦法嗎?

回答

1

使用pd.mergedf之間並結合df2+df3

In [1150]: df.merge(df2.append(df3), left_on=['id'], right_on=['c_id'], how='left') 
Out[1150]: 
    id value c_id flag 
0 1 100 1.0 N 
1 2 200 2.0 Y 
2 3 500 3.0 Y 
3 3 500 3.0 Y 
4 4 600 4.0 Y 
5 5 700 5.0 Y 
6 6 800 NaN NaN 

詳細

In [1151]: df2.append(df3) 
Out[1151]: 
    c_id flag 
0  2 Y 
1  3 Y 
2  5 Y 
0  1 N 
1  3 Y 
2  4 Y 
0

使用map你可以

In [1140]: df.assign(flag=df.id.map(
       df2.set_index('c_id')['flag'].combine_first(
        df3.set_index('c_id')['flag'])) 
       ) 
Out[1140]: 
    id value flag 
0 1 100 N 
1 2 200 Y 
2 3 500 Y 
3 4 600 Y 
4 5 700 Y 
5 6 800 NaN 

讓我解釋一下,使用​​和combine_first創造id一個mappingflag

In [1141]: mapping = df2.set_index('c_id')['flag'].combine_first(
         df3.set_index('c_id')['flag']) 

In [1142]: mapping 
Out[1142]: 
c_id 
1 N 
2 Y 
3 Y 
4 Y 
5 Y 
Name: flag, dtype: object 

In [1143]: df.assign(flag=df.id.map(mapping)) 
Out[1143]: 
    id value flag 
0 1 100 N 
1 2 200 Y 
2 3 500 Y 
3 4 600 Y 
4 5 700 Y 
5 6 800 NaN 
0

兩個DF2和DF3合併

df= pd.merge(pd.merge(df,df2,on='ID',how='left'),df3,on='ID',how='left') 

填充空

df['ID'] =df['ID_y'].fillna(df['ID_x'] 

刪除列

del df['ID_y']; del df['ID_x'] 

或者你也可以追加,

df4 = df2.append(df3) 
pd.merge(df,df4,how='left',on='ID')