如何在 pandas DataFrames 中将 NaN 或非对齐值视为 1 或 0

How to treat NaN or non aligned values as 1s or 0s in multiplying pandas DataFrames

我想将未对齐或缺失(NaN、Inf、-Inf)值视为 1 或 0。

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

以上代码结果如下

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

我想忽略 NaN,并且在左侧或右侧 DF 或两者中将非对齐值视为 1。

例如

案例 1:用 1

替换 df1 中丢失或未对齐的值
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

情况 2:用 1

替换 df2 中丢失或未对齐的值
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

情况 3:如果另一个 DF 中有值,则用 1 替换任何缺失或未对齐的值。

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

在 addison 的情况下,我想将缺失或未对齐的值视为 0。

我认为您需要 DataFrame.mul with fillna or combine_first 解决方案 12:

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

DataFrame.mulfill_value=13 输出的解决方案:

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

案例一 用 1

替换 df1 中丢失或未对齐的值
>>> 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 用 1 替换 df2 中丢失或未对齐的值

>>> 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 如果另一个 DF 中有值,则将任何缺失或未对齐的值替换为 1。

>>> 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