首页 > 解决方案 > Pandas DataFrame 将连续值设置为 nan 直到列中的值发生变化

问题描述

我有以下 DataFrame,其中Value指的是我的观察结果,Criterion指示何时应将Valuenp.nan设置为.

价值 标准
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发生变化。所需的输出应如下所示。

价值 标准
3 0
3 0
1
7 0
2 0
2 0
1
0
0
1 0

标签: pythonpandasdataframenumpynan

解决方案


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

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))

推荐阅读