Pandas 数据帧乘以只取 fill_value 的正确数据帧

Pandas Dataframe multiply with only the right dataframe taking fill_value

pandas.DataFrame.multiply()fill_value 参数填充 两个 数据帧中的缺失值。但是,我只想在第二个 DataFrame 中填充缺失值。除了下面我的 hacky 解决方案之外,还有什么好方法?

>>> df1 = pd.DataFrame({'a':[1, np.nan, 2], 'b':[np.nan, 3, 4]}, index = [1, 2, 3])
>>> df1
     a    b
1  1.0  NaN
2  NaN  3.0
3  2.0  4.0

>>> df2 = pd.DataFrame({'a':[2, np.nan], 'b':[3, np.nan], 'c':[1, 1]}, index = [1, 2])
>>> df2
     a    b    c
1  2.0  3.0  1.0
2  NaN  NaN  1.0

我想通过将 df1 保持为主要数据帧来按元素相乘,以便生成的形状和 NaN 条目应匹配 df1,同时填充NaNs in df2 取值1,得到

     a    b
1  2.0  NaN
2  NaN  3.0
3  2.0  4.0

天真的解决方案不起作用:

>>> df1.multiply(df2, fill_value=1)
     a    b    c
1  2.0  3.0  1.0
2  NaN  3.0  1.0
3  2.0  4.0  NaN

我的 hacky 解决方案是用 1s 创建一个矩阵,其中 df1 有值,并通过 df2

更新
>>> df3 = df1/df1
>>> df3.update(df2)
>>> df3
     a    b
1  2.0  3.0
2  NaN  1.0
3  1.0  1.0
>>> df1.multiply(df3)
     a    b
1  2.0  NaN
2  NaN  3.0
3  2.0  4.0

就是感觉不太优雅。关于使用 df1df2 直接操作的任何好主意,希望是单行的?

一种替代方法是根据 df1:

中的空值过滤结果
df1.multiply(df2, fill_value=1)[df1.notnull()]
Out: 
     a    b
1  2.0  NaN
2  NaN  3.0
3  2.0  4.0

您可以在 df2 上使用 reindex and fillna:

df1.multiply(df2.reindex(df1.index).fillna(1))

     a    b
1  2.0  NaN
2  NaN  3.0
3  2.0  4.0

这种情况下不需要显式调用multiply,直接用*做乘法即可:

df1 * df2.reindex(df1.index).fillna(1)

     a    b
1  2.0  NaN
2  NaN  3.0
3  2.0  4.0

此外,如果您需要将 df2 的列与 df1 对齐,请使用 reindexcolumns 参数:

df1 * df2.reindex(index=df1.index, columns=df1.columns).fillna(1)