python - 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 |
解决方案
按列中的连续值创建组Value
并测试是否至少有一个1
,Criterion
然后在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
或者,如果需要测试第一个值是1
列Criterion
使用中的每个连续组:
s= df['Value'].ne(df['Value'].shift()).cumsum()
df['Value'] = df['Value'].mask(df['Criterion'].groupby(s).transform('first').eq(1))
推荐阅读
- python - In Dash subplots how do I only increase the height of the very first plot keeping other subplots unchanged?
- android - 带文本的状态进度条
- html - How can I refer a library only to a specific part of the HTML?
- jquery - Add active class on label if selected option value in edit mode?
- javascript - Node.js 使用来自单独 javascript 文件的 express.js
- java - 无法从 java 中的缩短 url 中获取扩展 url
- ios - JSON Decodable - search by key
- xacml - 基于属性的访问控制:“搜索”操作的资源是什么
- python - python - webdriver 和 asyncio
- c++ - 检查一个文本文件中的单词是否在第二个文本文件中(C++)