I using python 3 and i have three dataframe:
df1
| PEOPLE | AMOUNT_custom_A | AMOUNT_custom_B |
|---|---|---|
| P1 | NaN | NaN |
| P2 | NaN | NaN |
| P3 | NaN | NaN |
df2:
| PEOPLE | AMOUNT |
|---|---|
| P1 | 1.0 |
| P2 | 1.0 |
df3
| PEOPLE | AMOUNT |
|---|---|
| P2 | 1.0 |
| P3 | 4.0 |
df_1= pd.merge(df_1, df2, on ='PEOPLE ', how ='outer') //(Step 1)
df_1= pd.merge(df_1, df3, on ='PEOPLE ', how ='outer') //(Step 2)
df_1= df_1.loc[:, ~df_merge.columns.str.contains('^Unnamed')]
Ouput Actual:
| PEOPLE | AMOUNT_custom_A | AMOUNT_custom_B | AMOUNT_X | AMOUNT_Y |
|---|---|---|---|---|
| P1 | NaN | NaN | 1.0 | NaN |
| P2 | NaN | NaN | 1.0 | 1.0 |
| P3 | NaN | NaN | NaN | 4.0 |
Question How to field data at (Step 1) to column AMOUNT_custom_A and field data at (Step 2) to column AMOUNT_custom_B?
Ouput Expected:
| PEOPLE | AMOUNT_custom_A | AMOUNT_custom_B |
|---|---|---|
| P1 | 1.0 | NaN |
| P2 | 1.0 | 1.0 |
| P3 | NaN | 4.0 |
Thank you !
CodePudding user response:
Add Series.fillna with DataFrame.pop:
df['AMOUNT_custom_A'] = df['AMOUNT_custom_A'].fillna(df.pop('AMOUNT_X'))
df['AMOUNT_custom_B'] = df['AMOUNT_custom_B'].fillna(df.pop('AMOUNT_Y'))
If alwyas missing columns AMOUNT_custom_A and AMOUNT_custom_B first select only PEOPLE column for df1 and rename columns names in merge:
df_1= pd.merge(df_1[['PEOPLE']], df2.rename(columns={'AMOUNT':'AMOUNT_custom_A'}), on ='PEOPLE ', how ='outer') //(Step 1)
df_1= pd.merge(df_1, df3.rename(columns={'AMOUNT':'AMOUNT_custom_B'}), on ='PEOPLE ', how ='outer') //(Step 2)
df_1= df_1.loc[:, ~df_merge.columns.str.contains('^Unnamed')]
