【问题标题】:Pandas DataFrame set consecutive values to nan until value in column changesPandas DataFrame 将连续值设置为 nan 直到列中的值发生变化
【发布时间】:2021-12-23 17:59:57
【问题描述】:

我有以下 DataFrame,其中 Value 指的是我的观察结果,Criterion 表示何时应将 Value 设置为 @987654323 @。

Value Criterion
3 0
3 0
5 1
7 0
2 0
2 0
8 1
8 0
8 0
1 0

每当 Criterion 等于 1 时,我想将同一行中的 Value 以及所有连续的 Value 设置为零直到 Value 改变。 所需的输出应如下所示。

Value Criterion
3 0
3 0
nan 1
7 0
2 0
2 0
nan 1
nan 0
nan 0
1 0

【问题讨论】:

    标签: python pandas dataframe numpy nan


    【解决方案1】:

    通过Value列中的连续值创建组,并测试Criterion中是否至少有一个1,然后在Series.mask中为每个组设置NaN:

    s = df['Value'].ne(df['Value'].shift()).cumsum()
    
    df['Value'] = df['Value'].mask(df['Criterion'].groupby(s).transform('any'))
    print (df)
       Value  Criterion
    0    3.0          0
    1    3.0          0
    2    NaN          1
    3    7.0          0
    4    2.0          0
    5    2.0          0
    6    NaN          1
    7    NaN          0
    8    NaN          0
    9    1.0          0
    

    或者如果需要测试第一个值是1Criterion 列中的每个连续组,请使用:

    s= df['Value'].ne(df['Value'].shift()).cumsum()
    
    df['Value'] = df['Value'].mask(df['Criterion'].groupby(s).transform('first').eq(1))
    

    【讨论】:

    • 谢谢,但您的 sn-p 还将其他重复值设置为零。我已经更新了示例数据框以明确这一点
    • @Michael - 你是对的,答案被 mask 更改为设置为 NaN if True
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2020-12-31
    • 2014-12-01
    • 2022-07-07
    • 2015-09-16
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多