【问题标题】:Make all entries before a zero to zeroes in a dataframe column在数据框列中从零到零之前的所有条目
【发布时间】:2021-02-03 20:34:04
【问题描述】:

我想将所有非零值转换为零,直到每个组的 python 数据框列中最后一个零出现。

group | value | Result
 a    | 1     |  0
 a    | 2     |  0
 a    | 0     |  0
 a    | 1     |  0
 a    | 0     |  0
 a    | 1     |  1
 a    | 2     |  2
 b    | 1     |  0
 b    | 0     |  0
 b    | 2     |  2

我可以想到实现此目的的一种方法是反转value 列并将其上方的元素乘以每个组的元素,但是我不知道如何在 python 数据框中执行此操作。 任何帮助表示赞赏

【问题讨论】:

    标签: python pandas dataframe filter


    【解决方案1】:

    您可以通过比较0 的值、将Series.ilocGroupBy.cumsum 的值交换以及最后比较不等于0 的值来测试所有值是否最后0,此掩码传递给Series.mask

    m = df['value'].eq(0).iloc[::-1].groupby(df['group']).cumsum().ne(0)
    df['New'] = df['value'].mask(m, 0)
    

    换回原始订单的类似解决方案:

    df1 = df.iloc[::-1]
    m = df1['value'].eq(0).groupby(df1['group']).cumsum().ne(0).iloc[::-1]
    df['New'] = df['value'].mask(m, 0)
    
    print (df)
      group  value  Result  New
    0     a      1       0    0
    1     a      2       0    0
    2     a      0       0    0
    3     a      1       0    0
    4     a      0       0    0
    5     a      1       1    1
    6     a      2       2    2
    7     b      1       0    0
    8     b      0       0    0
    9     b      2       2    2
    

    【讨论】:

    • 两种方法似乎都给出了相同的结果——这两种方法有什么区别?
    • @user6386155 - 我的意见 - 第二个更严格,因为有明确的第二个更改顺序iloc,所以在较旧的熊猫版本中应该更好地工作第二个。
    • @user6386155 - 在第一个解决方案中,pandas 通过原始索引隐式更改二阶(内部使用 iloc[::-1]
    猜你喜欢
    • 2019-06-19
    • 2021-06-15
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2014-02-27
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多