Pandas 计数器通过跳过一行来计数并重置不同的值

Posted

技术标签:

【中文标题】Pandas 计数器通过跳过一行来计数并重置不同的值【英文标题】:Pandas counter that counts by skipping a row and reset on different values 【发布时间】:2021-04-09 02:30:32 【问题描述】:

您好,我正在尝试创建一个计数器,通过跳过一行来计算我的趋势列,如果字符串值不同,则自行重置。例如,在第 9 行,它将计为 2,因为上一个跳过的行被计为 1。但由于第 11 行的值与第 9 行不同,它会重置回 1。 反正我可以这样做吗?

DateTimeStarted         50% Quantile    50Q shift 2H    Trend    Count
0   2020-12-18 15:00:00 554.0           NaN             Flat     1
1   2020-12-18 16:00:00 593.0           NaN             Flat     1
2   2020-12-18 17:00:00 534.0           554.0           Down     1
3   2020-12-18 18:00:00 562.0           593.0           Down     1
4   2020-12-18 19:00:00 552.0           534.0           Up       1
5   2020-12-18 20:00:00 592.0           562.0           Up       1
6   2020-12-19 08:00:00 511.0           552.0           Down     1
7   2020-12-19 09:00:00 584.0           592.0           Down     1
8   2020-12-19 10:00:00 576.0           511.0           Up       1
9   2020-12-19 11:00:00 545.5           584.0           Down     2
10  2020-12-19 12:00:00 609.5           576.0           Up       2
11  2020-12-19 13:00:00 548.0           545.5           Up       1
12  2020-12-19 14:00:00 565.0           609.5           Down     1
13  2020-12-19 15:00:00 575.0           548.0           Up       2
14  2020-12-19 16:00:00 570.0           565.0           Up       1
15  2020-12-19 17:00:00 557.0           575.0           Down     1 
16  2020-12-19 18:00:00 578.0           570.0           Up       2
17  2020-12-19 19:00:00 578.5           557.0           Up       1
18  2020-12-21 08:00:00 543.0           578.0           Down     1
19  2020-12-21 09:00:00 558.0           578.5           Down     1
20  2020-12-21 10:00:00 570.0           543.0           Up       1

【问题讨论】:

当前的Count 列是您想要的输出吗?似乎有很多 Trend 转换没有创建 Count 更改,所以我不太明白。 是的,这是所需的输出 为什么Count不改变索引2(Flat->Down)或索引4(Down->Up)、索引6等?跨度> 不应该通过跳过 1 行来计算。因此,对于索引 4 比较索引 6,如果它是 (Up -> Up),那么它会将计数增加到 2。 【参考方案1】:

您可以将shift()Trend 列乘以 2 并检查它是否等于Trend

df['Counter'] = df.Trend.shift(2).eq(df.Trend).astype(int).add(1)

我在这里将其命名为Counter 以进行比较:

        DateTimeStarted  50%Quantile  50Qshift2H Trend  Count  Counter
0   2020-12-18 15:00:00        554.0         NaN  Flat      1        1
1   2020-12-18 16:00:00        593.0         NaN  Flat      1        1
2   2020-12-18 17:00:00        534.0       554.0  Down      1        1
3   2020-12-18 18:00:00        562.0       593.0  Down      1        1
4   2020-12-18 19:00:00        552.0       534.0    Up      1        1
5   2020-12-18 20:00:00        592.0       562.0    Up      1        1
6   2020-12-19 08:00:00        511.0       552.0  Down      1        1
7   2020-12-19 09:00:00        584.0       592.0  Down      1        1
8   2020-12-19 10:00:00        576.0       511.0    Up      1        1
9   2020-12-19 11:00:00        545.5       584.0  Down      2        2
10  2020-12-19 12:00:00        609.5       576.0    Up      2        2
11  2020-12-19 13:00:00        548.0       545.5    Up      1        1
12  2020-12-19 14:00:00        565.0       609.5  Down      1        1
13  2020-12-19 15:00:00        575.0       548.0    Up      2        2
14  2020-12-19 16:00:00        570.0       565.0    Up      1        1
15  2020-12-19 17:00:00        557.0       575.0  Down      1        1
16  2020-12-19 18:00:00        578.0       570.0    Up      2        2
17  2020-12-19 19:00:00        578.5       557.0    Up      1        1
18  2020-12-21 08:00:00        543.0       578.0  Down      1        1
19  2020-12-21 09:00:00        558.0       578.5  Down      1        1
20  2020-12-21 10:00:00        570.0       543.0    Up      1        1

【讨论】:

是的,它是正确的。我最初使用了这段代码,但结果并不好。 df['Count'] = df.groupby((df['Trend'] != df['Trend'].shift(2)).cumsum()).cumcount()+1

以上是关于Pandas 计数器通过跳过一行来计数并重置不同的值的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Groupby:计数和平均值相结合

Python pandas数据计数函数value_counts

计算Hive中计数器数据的差异

根据测试是不是成功通过不同的测试计数

在 pyspark 中,基于变量字段进行分组,并为特定值添加一个计数器(当变量更改时重置)

对行编号并在特定条件下将计数器重置为 1