我尝试过类似示例的解决方案,但我还没有设法让它发挥作用。我的df看起来像这样:
S
2017-07-21 -1.0
2017-07-24 -1.0
2017-07-25 -1.0
2017-07-26 1.0
2017-07-27 1.0
2017-07-28 1.0
2017-07-31 -1.0
2017-08-01 1.0
2017-08-02 1.0
2017-08-03 -1.0
2017-08-04 -1.0
2017-08-07 -1.0
2017-08-08 1.0
2017-08-09 1.0
2017-08-10 1.0
我需要对列值的每个更改进行编号,输出应为:
S n
2017-07-21 -1.0 1
2017-07-24 -1.0 1
2017-07-25 -1.0 1
2017-07-26 1.0 2
2017-07-27 1.0 2
2017-07-28 1.0 2
2017-07-31 -1.0 3
2017-08-01 1.0 4
2017-08-02 1.0 4
2017-08-03 -1.0 5
2017-08-04 -1.0 5
2017-08-07 -1.0 5
2017-08-08 1.0 6
2017-08-09 1.0 6
2017-08-10 1.0 6
有什么建议吗?
答案 0 :(得分:2)
使用shift
检查连续的数字。
In [2521]: (df.S != df.S.shift()).cumsum()
Out[2521]:
2017-07-21 1
2017-07-24 1
2017-07-25 1
2017-07-26 2
2017-07-27 2
2017-07-28 2
2017-07-31 3
2017-08-01 4
2017-08-02 4
2017-08-03 5
2017-08-04 5
2017-08-07 5
2017-08-08 6
2017-08-09 6
2017-08-10 6
Name: S, dtype: int32
像
一样分配In [2522]: df['n'] = (df.S != df.S.shift()).cumsum()
In [2523]: df
Out[2523]:
S n
2017-07-21 -1.0 1
2017-07-24 -1.0 1
2017-07-25 -1.0 1
2017-07-26 1.0 2
2017-07-27 1.0 2
2017-07-28 1.0 2
2017-07-31 -1.0 3
2017-08-01 1.0 4
2017-08-02 1.0 4
2017-08-03 -1.0 5
2017-08-04 -1.0 5
2017-08-07 -1.0 5
2017-08-08 1.0 6
2017-08-09 1.0 6
2017-08-10 1.0 6
或使用diff
In [2527]: df.S.diff().ne(0).cumsum()
Out[2527]:
2017-07-21 1
2017-07-24 1
2017-07-25 1
2017-07-26 2
2017-07-27 2
2017-07-28 2
2017-07-31 3
2017-08-01 4
2017-08-02 4
2017-08-03 5
2017-08-04 5
2017-08-07 5
2017-08-08 6
2017-08-09 6
2017-08-10 6
Name: S, dtype: int32
详细
In [2524]: df.S != df.S.shift()
Out[2524]:
2017-07-21 True
2017-07-24 False
2017-07-25 False
2017-07-26 True
2017-07-27 False
2017-07-28 False
2017-07-31 True
2017-08-01 True
2017-08-02 False
2017-08-03 True
2017-08-04 False
2017-08-07 False
2017-08-08 True
2017-08-09 False
2017-08-10 False
Name: S, dtype: bool