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 计数器通过跳过一行来计数并重置不同的值的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas数据计数函数value_counts