Pandas Dataframe只与正确的数据帧相乘,并采用fill_value

时间:2017-05-17 18:29:09

标签: pandas dataframe multiplication

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直接操纵的任何好主意,希望是一个单行?

2 个答案:

答案 0 :(得分:3)

您可以在df2上使用reindexfillna

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