Использование fillna
с eq
df2.fillna(df1).eq(df1).all(0)
A True
B True
C False
dtype: bool
Это работает, заполняя NaN
значения действительными значениями от df1
, поэтому они всегда будут равны, где df2
равно нулю (по сути, то же самое, что игнорировать их). Далее мы создаем логическую маску, сравнивающую два массива:
df2.fillna(df1).eq(df1)
A B C
2000-01-01 True True True
2000-01-02 True True True
2000-01-03 True True True
2000-01-04 True True False
2000-01-05 True True False
Наконец, мы утверждаем, что все значения для каждого столбца равны True
, чтобы столбцы считались равными.
Настройка
Похоже, что вы скопировали неправильный DataFrame для df1
на основе вашего желаемого вывода и слияния, поэтому я извлек его из вашего merge
:
df1 = pd.DataFrame({'A': {'2000-01-01': 3.0, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': 4.0, '2000-01-02': 9.0, '2000-01-03': 6.0, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': 5.0, '2000-01-02': 2.0, '2000-01-03': 5.0, '2000-01-04': 1.0, '2000-01-05': 3.0}})
df2 = pd.DataFrame({'A': {'2000-01-01': np.nan, '2000-01-02': 5.0, '2000-01-03': 1.0, '2000-01-04': 2.0, '2000-01-05': 1.0}, 'B': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': np.nan, '2000-01-04': 4.0, '2000-01-05': 3.0}, 'C': {'2000-01-01': np.nan, '2000-01-02': np.nan, '2000-01-03': 5.0, '2000-01-04': 8.0, '2000-01-05': 4.0}})