如何在pandas df列中对组进行编号

时间:2017-09-22 09:01:39

标签: python-2.7 pandas

我尝试过类似示例的解决方案,但我还没有设法让它发挥作用。我的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

有什么建议吗?

1 个答案:

答案 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