简体   繁体   中英

replace value based on other dataframe

There are two dataframe with same columns, index and the order of the columns are the same. I call them tableA and tableB.

    tableA = pd.DataFrame({'col1':[np.NaN,1,2],'col2':[2,3,np.NaN]})
    tableB = pd.DataFrame({'col1':[2,4,2],'col2':[2,3,5]})

    tableA                          tableB
               col1    col2                    col1    col2
          0      na       2               0       2       2
          1       1       3               1       4       5
          2       2      na               2       2       5

I want to replace some value of tableB to 'NA' where the value of same position of tableA is na. For now, I use loop to do it column by column.

    for n in range(tableB.shape[1]):
        tableB.iloc[:,n] = tableB.iloc[:,n].where(pd.isnull(tableA.iloc[:,n])==False,'NA')

    tableB                         
               col1    col2            
          0      NA       2               
          1       4       5               
          2       2      NA               

Is there other way to do it without using loop? I have tried using replace but it can only change the first column.

    tableB.replace(pd.isnull(tableA), 'NA', inplace=True) #only adjust the first column.

Thanks for your help!

You could use mask

In [7]: tableB.mask(tableA.isnull())
Out[7]:
   col1  col2
0   NaN   2.0
1   4.0   3.0
2   2.0   NaN

I think you need where or numpy.where :

1.

df = tableB.where(tableA.notnull())
print (df)
   col1  col2
0   NaN   2.0
1   4.0   3.0
2   2.0   NaN

2.

df = pd.DataFrame(np.where(tableA.notnull(), tableB, np.nan), 
                  columns=tableB.columns, 
                  index=tableB.index)
print (df)
   col1  col2
0   NaN   2.0
1   4.0   3.0
2   2.0   NaN
tableB[tableA.isnull()] = np.nan

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM