Заменить ячейки фрейма данных на NaN на основе индексов и столбцов другого фрейма данных

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Я работаю с двумя фреймами данных, например: df1 и df2, как показано в следующем коде:

 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'])
  

Я хотел бы получить новый фрейм данных df3, который сохраняет значения df2 и заменяет ячейки на Nan в соответствии с индексами df1. Так что результат будет примерно таким:

 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
  

Спасибо за помощь!

Ответ №1:

Если возможно совпадение имен индексов и столбцов между df1 и df2 , используйте 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