【问题标题】:Pandas 'counter' column with reset citeria具有设定标准的熊猫“计数”列
【发布时间】:2022-06-28 01:18:49
【问题描述】:

我正在尝试在 DataFrame 中实现计数器功能。计数器应始终从 0 开始计数,当列中出现 0 时,应重置计数器并从 0 重新开始。

如何在不需要循环的情况下实现此功能?

附上一个dataFrame,便于理解和对应的结果:

df = pd.DataFrame({"date": pd.date_range("2017-08-01", "2017-08-02", freq='H'), "counter": [0, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 0, np.nan, np.nan, np.nan, np.nan, np.nan, 0, np.nan, np.nan, 0, 0, np.nan, np.nan, np.nan, np.nan, 0, np.nan, np.nan]})

初始情况:

    date                counter
0   2017-08-01 00:00:00 0.0
1   2017-08-01 01:00:00 NaN
2   2017-08-01 02:00:00 NaN
3   2017-08-01 03:00:00 NaN
4   2017-08-01 04:00:00 NaN
5   2017-08-01 05:00:00 NaN
6   2017-08-01 06:00:00 NaN
7   2017-08-01 07:00:00 0.0
8   2017-08-01 08:00:00 NaN
9   2017-08-01 09:00:00 NaN
10  2017-08-01 10:00:00 NaN
11  2017-08-01 11:00:00 NaN
12  2017-08-01 12:00:00 NaN
13  2017-08-01 13:00:00 0.0
14  2017-08-01 14:00:00 NaN
15  2017-08-01 15:00:00 NaN
16  2017-08-01 16:00:00 0.0
17  2017-08-01 17:00:00 0.0
18  2017-08-01 18:00:00 NaN
19  2017-08-01 19:00:00 NaN
20  2017-08-01 20:00:00 NaN
21  2017-08-01 21:00:00 NaN
22  2017-08-01 22:00:00 0.0
23  2017-08-01 23:00:00 NaN
24  2017-08-02 00:00:00 NaN

解决方案:

    date                counter
0   2017-08-01 00:00:00 0
1   2017-08-01 01:00:00 1
2   2017-08-01 02:00:00 2
3   2017-08-01 03:00:00 3
4   2017-08-01 04:00:00 4
5   2017-08-01 05:00:00 5
6   2017-08-01 06:00:00 6
7   2017-08-01 07:00:00 0
8   2017-08-01 08:00:00 1
9   2017-08-01 09:00:00 2
10  2017-08-01 10:00:00 3
11  2017-08-01 11:00:00 4
12  2017-08-01 12:00:00 5
13  2017-08-01 13:00:00 0
14  2017-08-01 14:00:00 1
15  2017-08-01 15:00:00 2
16  2017-08-01 16:00:00 0
17  2017-08-01 17:00:00 0
18  2017-08-01 18:00:00 1
19  2017-08-01 19:00:00 2
20  2017-08-01 20:00:00 3
21  2017-08-01 21:00:00 4
22  2017-08-01 22:00:00 0
23  2017-08-01 23:00:00 1
24  2017-08-02 00:00:00 2

【问题讨论】:

    标签: pandas dataframe time-series


    【解决方案1】:

    你可以在 counter 等于 0 和 cumsum 的组上做 groupby

    df['res'] = df.groupby(df['counter'].eq(0).cumsum()).cumcount()
    print(df)
    #                   date  counter  res
    # 0  2017-08-01 00:00:00      0.0    0
    # 1  2017-08-01 01:00:00      NaN    1
    # 2  2017-08-01 02:00:00      NaN    2
    # 3  2017-08-01 03:00:00      NaN    3
    # 4  2017-08-01 04:00:00      NaN    4
    # 5  2017-08-01 05:00:00      NaN    5
    # 6  2017-08-01 06:00:00      NaN    6
    # 7  2017-08-01 07:00:00      0.0    0
    # 8  2017-08-01 08:00:00      NaN    1
    # 9  2017-08-01 09:00:00      NaN    2
    # 10 2017-08-01 10:00:00      NaN    3
    # 11 2017-08-01 11:00:00      NaN    4
    # 12 2017-08-01 12:00:00      NaN    5
    # 13 2017-08-01 13:00:00      0.0    0
    # 14 2017-08-01 14:00:00      NaN    1
    # 15 2017-08-01 15:00:00      NaN    2
    # 16 2017-08-01 16:00:00      0.0    0
    # 17 2017-08-01 17:00:00      0.0    0
    # 18 2017-08-01 18:00:00      NaN    1
    # ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 2017-08-13
      相关资源
      最近更新 更多