python - 如何根据特定规则标记一系列值?

标签 python pandas dataframe

我想在我的意甲联赛中找到积极和消极的波浪。那么如何标记数据呢?
示例
我的数据:

| date                | value |
|---------------------|-------|
| 2018-09-06 00:00:03 | 0     |
| 2018-09-06 00:00:04 | 0     |
| 2018-09-06 00:00:05 | 1     |
| 2018-09-06 00:00:06 | 1     |
| 2018-09-06 00:00:07 | 2     |
| 2018-09-06 00:00:08 | -1    |
| 2018-09-06 00:00:09 | -5    |
| 2018-09-06 00:00:10 | 0     |
| 2018-09-06 00:00:11 | -6    |
| 2018-09-06 00:00:12 | 2     |
| 2018-09-06 00:00:13 | 0     |
| 2018-09-06 00:00:14 | 4     |

我想要的结果:

| date                | value | sign |
|---------------------|-------|------|
| 2018-09-06 00:00:03 | 0     | 1    |
| 2018-09-06 00:00:04 | 0     | 1    |
| 2018-09-06 00:00:05 | 1     | 1    |
| 2018-09-06 00:00:06 | 1     | 1    |
| 2018-09-06 00:00:07 | 2     | 1    |
| 2018-09-06 00:00:08 | -1    | 2    |
| 2018-09-06 00:00:09 | -5    | 2    |
| 2018-09-06 00:00:10 | 0     | 2    |
| 2018-09-06 00:00:11 | -6    | 2    |
| 2018-09-06 00:00:12 | 2     | 3    |
| 2018-09-06 00:00:13 | 0     | 3    |
| 2018-09-06 00:00:14 | 4     | 3    |

然后:

mydata.groupby(['sign']).transform('sum')

最佳答案

您的样本数据不包括正波和负波用零分隔的情况,例如1 0 0 -1。这是涵盖该案例的解决方案:

# mask the zeros
s = mydata['value'].eq(0)

# merge the zeros to the wave after them
m = np.sign(mydata['value']).mask(s).bfill()

# result
mydata['sign'] = m.diff().ne(0).cumsum()

关于python - 如何根据特定规则标记一系列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58819227/

相关文章:

python - 根据需要的值将其他行插入到数据框中

python - 如何在python中为绘图添加填充?

python - Pandas 0.14.1 StataReader - 阅读 .dta 文件

python - 是否可以在不使用 co_code 的情况下获取 python 字节码?

Python:同步三重任务和常规线程的方法

python - 如何在 Pandas 约会后 8 天内获得 1,否则如何获得 0?

r - 检查一个数据帧是否是另一个数据帧的重新排序

python - 根据数据帧 B 中其他两列给出的范围填充数据帧 A 中的列

python - 按列比较不同的 pandas 数据框与公差变化

python - 在 Scrapy 中使用经过身份验证的 session 进行爬网