fill_value
pandas.DataFrame.multiply()
参数填充两个数据框中的缺失值。但是,我想在第二个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
作为主导数据,将两个DataFrames元素相乘,以便生成的形状和NaN
条目与df1
匹配,同时填充{{ 1}}在NaN
中按值1,得到
df2
天真的解决方案不起作用:
a b
1 2.0 NaN
2 NaN 3.0
3 2.0 4.0
我的hacky解决方案是创建一个>>> 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
的矩阵,其中1
具有值,并按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
直接操纵的任何好主意,希望是一个单行?
答案 0 :(得分:3)
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
对齐,请使用columns
的{{1}}参数:
reindex
答案 1 :(得分:2)
一种替代方法是根据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