[英]Pandas DataFrame set consecutive values to nan until value in column changes
I have the following DataFrame, where Value refers to my observations, and Criterion indicates, when a Value should be set to np.nan
.我有以下 DataFrame,其中Value是指我的观察结果, Criterion指示何时应将Value设置为
np.nan
。
Value![]() |
Criterion![]() |
---|---|
3 ![]() |
0 ![]() |
3 ![]() |
0 ![]() |
5 ![]() |
1 ![]() |
7 ![]() |
0 ![]() |
2 ![]() |
0 ![]() |
2 ![]() |
0 ![]() |
8 ![]() |
1 ![]() |
8 ![]() |
0 ![]() |
8 ![]() |
0 ![]() |
1 ![]() |
0 ![]() |
Whenever Criterion is equal to 1, I want to set the Value in the same row, as well as all consecutive Value s to zero until Value changes.每当Criterion等于 1 时,我想将同一行中的Value以及所有连续的Value设置为零,直到Value更改。 The desired output should look like this.
所需的输出应如下所示。
Value![]() |
Criterion![]() |
---|---|
3 ![]() |
0 ![]() |
3 ![]() |
0 ![]() |
nan![]() |
1 ![]() |
7 ![]() |
0 ![]() |
2 ![]() |
0 ![]() |
2 ![]() |
0 ![]() |
nan![]() |
1 ![]() |
nan![]() |
0 ![]() |
nan![]() |
0 ![]() |
1 ![]() |
0 ![]() |
Create groups by consecutive values in Value
column and test if at least one 1
in Criterion
, then set NaN
per group in Series.mask
:在
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
Or if need test first value is 1
per consecutive groups in column Criterion
use:或者,如果需要测试第一个值是
1
列Criterion
每个连续组,请使用:
s= df['Value'].ne(df['Value'].shift()).cumsum()
df['Value'] = df['Value'].mask(df['Criterion'].groupby(s).transform('first').eq(1))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.