1
votes

I am working with two dataframes, eg.: df1 and df2 as shown in the next code:

import numpy as np
import pandas as pd

df1 = pd.DataFrame([
                    [1,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN],
                    [np.NaN,2,np.NaN,np.NaN,np.NaN,np.NaN],
                    [np.NaN,np.NaN,3,np.NaN,np.NaN,np.NaN],
                    [np.NaN,np.NaN,np.NaN,4,np.NaN,np.NaN],
                    [np.NaN,np.NaN,np.NaN,np.NaN,5,np.NaN],
                    [np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,6],
                    ], columns=['AA','BB','CC','DD', 'EE', 'FF'])

df2 = pd.DataFrame([[100, 200, 300, 400, 500, 600],
                    [110, 210, 310, 410, 510, 610],
                    [120, 220, 320, 420, 520, 620],
                    [130, 230, 330, 430, 530, 630],
                    [140, 240, 340, 440, 540, 640],
                    [150, 250, 350, 450, 550, 650]
                    ], columns=['AA', 'BB', 'CC', 'DD', 'EE', 'FF'])

I would like to obtain a new dataframe, df3, that keeps the values of df2 and replaced the cells by Nan according to the indexes of the df1. So that the result is something like that:

DataFrame1_______
    AA   BB   CC   DD   EE   FF
0  1.0  NaN  NaN  NaN  NaN  NaN
1  NaN  2.0  NaN  NaN  NaN  NaN
2  NaN  NaN  3.0  NaN  NaN  NaN
3  NaN  NaN  NaN  4.0  NaN  NaN
4  NaN  NaN  NaN  NaN  5.0  NaN
5  NaN  NaN  NaN  NaN  NaN  6.0
DataFrame2_______
    AA   BB   CC   DD   EE   FF
0  100  200  300  400  500  600
1  110  210  310  410  510  610
2  120  220  320  420  520  620
3  130  230  330  430  530  630
4  140  240  340  440  540  640
5  150  250  350  450  550  650
DataFrame3_______
      AA     BB     CC     DD     EE     FF
0  100.0    NaN    NaN    NaN    NaN    NaN
1    NaN  210.0    NaN    NaN    NaN    NaN
2    NaN    NaN  320.0    NaN    NaN    NaN
3    NaN    NaN    NaN  430.0    NaN    NaN
4    NaN    NaN    NaN    NaN  540.0    NaN
5    NaN    NaN    NaN    NaN    NaN  650.0

Thanks for the help!

1

1 Answers

1
votes

If index and columns names matching between df1 and df2 is possible use DataFrame.mask:

df3 = df2.mask(df1.isna())
print (df3)
      AA     BB     CC     DD     EE     FF
0  100.0    NaN    NaN    NaN    NaN    NaN
1    NaN  210.0    NaN    NaN    NaN    NaN
2    NaN    NaN  320.0    NaN    NaN    NaN
3    NaN    NaN    NaN  430.0    NaN    NaN
4    NaN    NaN    NaN    NaN  540.0    NaN
5    NaN    NaN    NaN    NaN    NaN  650.0