I have a pandas dataframe, lets call it df1 that looks like this (the follow is just a sample to give an idea of the dataframe):
| Ac | Tp | Id | 2020 | 2021 | 2022 |
|---|---|---|---|---|---|
| Efecty | FC | IQ_EF | 100 | 200 | 45 |
| Asset | FC | 52 | 48 | 15 | |
| Debt | P&G | IQ_DEBT | 45 | 58 | 15 |
| Tax | Other | 48 | 45 | 78 |
And I want to fill the blank spaces using a in the 'Id' column using the next auxiliar dataframe, lets call it df2 (again, this is just a sample):
| Ac | Tp | Id |
|---|---|---|
| Efecty | FC | IQ_EF |
| Asset | FC | IQ_AST |
| Debt | P&G | IQ_DEBT |
| Tax | Other | IQ_TAX |
| Income | BAL | IQ_INC |
| Invest | FC | IQ_INV |
To get df1 dataframe, looking like this:
| Ac | Tp | Id | 2020 | 2021 | 2022 |
|---|---|---|---|---|---|
| Efecty | FC | IQ_EF | 100 | 200 | 45 |
| Asset | FC | IQ_AST | 52 | 48 | 15 |
| Debt | P&G | IQ_DEBT | 45 | 58 | 15 |
| Tax | Other | IQ_TAX | 48 | 45 | 78 |
I tried with this line of code but it did not work:
df1['Id'] = df1['Id'].mask(df1('nan')).fillna(df1['Ac'].map(df2('Ac')['Id']))
Can you guys help me?
CodePudding user response:
Merge the two frames on Ac and Tp columns and assign the Id column from this result to df1.Id. This works similar to Excel Vlookup functionality.
ac_tp = ['Ac', 'Tp']
df1['Id'] = df1[ac_tp].merge(df2[[*ac_tp, 'Id']])['Id']
CodePudding user response:
In a similar vein you could also try:
df['Id'] = (df.merge(df2, on = ['Ac', 'Tp'])
.pipe(lambda d: d['Id_x'].mask(d['Id_x'].isnull(), d['Id_y'])))
Ac Tp Id 2020 2021 2022
0 Efecty FC IQ_EF 100 200 45
1 Asset FC IQ_AST 52 48 15
2 Debt P&G IQ_DEBT 45 58 15
3 Tax Other IQ_TAX 48 45 78

