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
,同时填充NaN
s 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 解决方案是用 1
s 创建一个矩阵,其中 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
就是感觉不太优雅。关于使用 df1
和 df2
直接操作的任何好主意,希望是单行的?
一种替代方法是根据 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
对齐,请使用 reindex
的 columns
参数:
df1 * df2.reindex(index=df1.index, columns=df1.columns).fillna(1)
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
,同时填充NaN
s 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 解决方案是用 1
s 创建一个矩阵,其中 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
就是感觉不太优雅。关于使用 df1
和 df2
直接操作的任何好主意,希望是单行的?
一种替代方法是根据 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
对齐,请使用 reindex
的 columns
参数:
df1 * df2.reindex(index=df1.index, columns=df1.columns).fillna(1)