How to handle NaN or non-aligned values ​​like 1s or 0s when multiplying pandas DataFrames

I want to handle non-aligned or missing values ​​(NaN, Inf, -Inf) as 1s or 0s.

df1 = pd.DataFrame({"x":[1, 2, 3, 4, 5], 
    "y":[3, 4, 5, 6, 7]}, 
    index=['a', 'b', 'c', 'd', 'e'])

df2 = pd.DataFrame({"y":[1, NaN, 3, 4, 5], 
    "z":[3, 4, 5, 6, 7]}, 
    index=['b', 'c', 'd', 'e', 'f'])

Above code leads to the following

df1 * df2
    x     y   z
a NaN   NaN NaN
b NaN   4.0 NaN
c NaN   NaN NaN
d NaN  18.0 NaN
e NaN  28.0 NaN
f NaN   NaN NaN

I want to ignore NaN, and also handle non-aligned values ​​like 1s in left or right DF or both.

eg.

Case 1: Replace the missing or inconsistent value with df1by 1

df1 * df2
    x     y   z
a   1     3 NaN
b   2   4.0 NaN
c   3     5 NaN
d   4  18.0 NaN
e   5  28.0 NaN
f NaN   NaN NaN

Case 2: replace the missing or inconsistent value with df2by 1

df1 * df2
    x     y   z
a NaN   NaN NaN
b NaN   4.0   3
c NaN   NaN   4
d NaN  18.0   5
e NaN  28.0   6
f NaN     5   7

Case 3: Replace any missing or inconsistent value with 1 if another DF has a value.

df1 * df2
    x     y   z
a   1     3 NaN
b   2   4.0   3
c   3     5   4
d   4  18.0   5
e   5  28.0   6
f NaN     5   7

In the case of addison, I want to treat missing or missing aligned values ​​as 0s.

+4
2

, DataFrame.mul fillna combine_first 1 2:

print (df1.mul(df2).fillna(df1))
     x     y   z
a  1.0   3.0 NaN
b  2.0   4.0 NaN
c  3.0   5.0 NaN
d  4.0  18.0 NaN
e  5.0  28.0 NaN
f  NaN   NaN NaN

print (df1.mul(df2).combine_first(df1))
     x     y   z
a  1.0   3.0 NaN
b  2.0   4.0 NaN
c  3.0   5.0 NaN
d  4.0  18.0 NaN
e  5.0  28.0 NaN
f  NaN   NaN NaN

print (df1.mul(df2).fillna(df2))
    x     y    z
a NaN   NaN  NaN
b NaN   4.0  3.0
c NaN   NaN  4.0
d NaN  18.0  5.0
e NaN  28.0  6.0
f NaN   5.0  7.0

print (df1.mul(df2).combine_first(df2))
    x     y    z
a NaN   NaN  NaN
b NaN   4.0  3.0
c NaN   NaN  4.0
d NaN  18.0  5.0
e NaN  28.0  6.0
f NaN   5.0  7.0

fill_value=1 DataFrame.mul 3:

print (df1.mul(df2, fill_value=1))
     x     y    z
a  1.0   3.0  NaN
b  2.0   4.0  3.0
c  3.0   5.0  4.0
d  4.0  18.0  5.0
e  5.0  28.0  6.0
f  NaN   5.0  7.0
+3

1 df1 1

>>> df1.reindex(index=df1.index.union(df2.index), 
                columns=df1.columns.union(df2.columns)).fillna(1)
   x  y  z
a  1  3  1
b  2  4  1
c  3  5  1
d  4  6  1
e  5  7  1
f  1  1  1

.mul(df2), .

2 df2 1

>>> df2.reindex(index=df2.index.union(df1.index), 
                columns=df2.columns.union(df1.columns)).fillna(1)
   x  y  z
a  1  1  1
b  1  1  3
c  1  1  4
d  1  3  5
e  1  4  6
f  1  5  7

.mul(df1), .

3 1, DF .

>>> df1.mul(df2).combine_first(df1).combine_first(df2)
    x   y   z
a   1   3 NaN
b   2   4   3
c   3   5   4
d   4  18   5
e   5  28   6
f NaN   5   7
+1

Source: https://habr.com/ru/post/1683103/


All Articles