代码之家  ›  专栏  ›  技术社区  ›  Loki

仅当满足另一列的Fillna条件时

  •  1
  • Loki  · 技术社区  · 3 年前

    我有一个数据框 测验 看起来是这样的:

    | sales |transactions|
    |-------|------------|
    |0.0    |NaN         |
    |0.0    |NaN         |
    |3802.29|NaN         |
    |4520.35|8359        |
    

    我正在寻找一种方法,在不更改其他行的情况下,只使用“sales”列中0的行中的0来填充NaN值。我试过这个:

    test['transactions'] = test.apply(
            lambda row: 0 if row['sales'] == 0 else None,
            axis=1)
    

    它适用于这些行,但问题是所有其他行都会被NaN填充

    输出:

    | sales |transactions|
    |-------|------------|
    |0.0    |0.0         |
    |0.0    |0.0         |
    |3802.29|NaN         |
    |4520.35|NaN         |
    

    预期结果:

    | sales |transactions|
    |-------|------------|
    |0.0    |0.0         |
    |0.0    |0.0         |
    |3802.29|NaN         |
    |4520.35|8359        |
    

    提前谢谢你。

    1 回复  |  直到 3 年前
        1
  •  1
  •   piRSquared    3 年前

    mask

    具体来说,使用 other 争论 面具

    df.assign(
        transactions=df.transactions.mask(df.sales == 0, other=0)
    )
    
         sales  transactions
    0     0.00           0.0
    1     0.00           0.0
    2  3802.29           NaN
    3  4520.35        8359.0
    

    如果您有一个非空的交易,其中销售额为零,并且不想将非空交易替换为零,那么请执行以下操作:

    mask = df.sales == 0 & df.transactions.isna()
    df.assign(
        transactions=df.transactions.mask(mask, other=0)
    
    )
    
    推荐文章