【问题标题】:Pandas Dataframe multiply with only the right dataframe taking fill_valuePandas Dataframe 与仅采用 fill_value 的正确数据帧相乘
【发布时间】:2017-05-17 18:29:09
【问题描述】:

pandas.DataFrame.multiply()fill_value 参数填充 both 数据帧中的缺失值。但是,我只想在第二个 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

我想将两个 DataFrames 元素相乘,将df1 保持为主要元素,以便生成的形状和NaN 条目应匹配df1,同时在NaNs 中填充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

我的解决方案是用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 直接操作的任何好主意,希望是单行的?

【问题讨论】:

    标签: pandas dataframe multiplication


    【解决方案1】:

    您可以在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对齐,请使用reindexcolumns参数:

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

    【讨论】:

    • 如果df1df2 也有不同的列会怎样?即时重塑 df2df1 的最佳方式是什么?
    • reindex 也允许您提供列,例如df2.reindex(index=df1.index, columns=df1.columns).
    • 好的,太好了 - 所以解决方案是 df1 * df2.reindex(index=df1.index,columns=df1.columns).fillna(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
    

    【讨论】:

    • 如果 df2 有多余的列我也不想要怎么办?我相应地编辑了 OP。谢谢。
    • @Zhang18 您可以像这样在乘法之前过滤这些列:df1.multiply(df2[df1.columns], fill_value=1)[df1.notnull()]
    • 谢谢。这也是一个不错的解决方案。
    猜你喜欢
    • 2016-10-19
    • 2012-11-18
    • 2018-10-19
    • 2020-06-24
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多