【问题标题】:How to replace values along the row until some condition is met?如何在满足某些条件之前替换行中的值?
【发布时间】:2022-12-08 01:48:43
【问题描述】:

想象一下我有一个这样的数据框:

df = pd.DataFrame({"ID":["A","B","C","C","D"],
                   "DAY 1":[0, 0, 4, 0, 8],
                   "DAY 2":[3, 0, 4, 1, 2],
                   "DAY 3":[0, 2, 9, 9, 6],
                   "DAY 4":[9, 2, 4, 5, 7]})

df
Out[7]: 
  ID  DAY 1  DAY 2  DAY 3  DAY 4
0  A      0      3      0      9
1  B      0      0      2      2
2  C      4      4      9      4
3  C      0      1      9      5
4  D      8      2      6      7

我想遍历每一行并在看到非零值之前替换行开头的所有 0 值。

ID 列不应该处于这种情况,只有其他列。我想用 NaN 替换这些值。所以输出应该是这样的:

  ID  DAY 1  DAY 2  DAY 3  DAY 4
0  A    nan      3      0      9
1  B    nan    nan      2      2
2  C      4      4      9      4
3  C    nan      1      9      5
4  D      8      2      6      7

并注意 df.loc[0, "DAY 3"] 中的 0 值仍然存在,因为它不满足条件,因为这种情况只发生在 df.loc[0, "DAY 2"] 之前。

任何人都可以帮助我吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以在 DataFrame 的子集上使用布尔值 cummin 来生成布尔索引的掩码:

    mask = (df.filter(like='DAY').eq(0).cummin(axis=1)
               .reindex(columns=df.columns, fill_value=False)
            )
    
    df[mask] = float('nan')
    
    print(df)
    

    输出:

    
      ID  DAY 1  DAY 2  DAY 3  DAY 4
    0  A    NaN    3.0      0      9
    1  B    NaN    NaN      2      2
    2  C    4.0    4.0      9      4
    3  C    NaN    1.0      9      5
    4  D    8.0    2.0      6      7
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-11
      • 2017-03-16
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-02
      • 2019-11-11
      • 1970-01-01
      相关资源
      最近更新 更多