如何创建根据另一列中的字符串值计数和重置的新列
How to create new column that counts and reset based on a string value in another column
我有一个这样的数据框
A B C B_shifted C_shifted Trend
0 553.666667 533.50 574.00 NaN NaN Flat
1 590.818182 575.50 595.50 533.50 574.00 Up
2 531.333333 527.50 536.50 575.50 595.50 Down
3 562.000000 562.00 562.00 527.50 536.50 Up
4 551.857143 538.50 557.50 562.00 562.00 Down
5 592.000000 585.50 598.50 538.50 557.50 Up
6 511.000000 511.00 511.00 585.50 598.50 Down
7 564.333333 548.00 590.50 511.00 511.00 Up
8 574.333333 552.00 580.00 548.00 590.50 Flat
9 537.500000 513.25 574.50 552.00 580.00 Down
10 609.500000 582.25 636.75 513.25 574.50 Up
11 535.000000 531.00 565.00 582.25 636.75 Down
12 567.142857 539.50 588.50 531.00 565.00 Up
13 566.625000 546.25 594.25 539.50 588.50 Up
14 576.631579 556.00 598.00 546.25 594.25 Up
15 558.333333 538.00 584.00 556.00 598.00 Down
我正在尝试创建一个列来计算趋势发生的次数。如果相同的趋势持续存在(例如从上到上,计数变为 2),它将递增,如果趋势发生变化(例如,从上到下,计数再次变为 1),它将重置回 1
这就是我想要达到的目标
A B C B_shifted C_shifted Trend Counter
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574.00 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562.00 562.00 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511.00 511.00 Up 1
8 574.333333 552.00 580.00 548.00 590.50 Flat 1
9 537.500000 513.25 574.50 552.00 580.00 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531.00 565.00 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556.00 598.00 Down 1
有办法吗?
您可以 shift()
the Trend
column to get trending indexes and then cumsum()
在热门组中:
trending = df.Trend.eq(df.Trend.shift())
df['Counter'] = trending.groupby(trending).cumsum().add(1)
输出:
A B C B_shifted C_shifted Trend Counter
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574.00 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562.00 562.00 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511.00 511.00 Up 1
8 574.333333 552.00 580.00 548.00 590.50 Flat 1
9 537.500000 513.25 574.50 552.00 580.00 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531.00 565.00 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556.00 598.00 Down 1
您可以使用 shift()
将值与以前的值进行比较,如果值相同,您可以使用 cumsum().add(1)
(因为默认值是从 0 开始),包含在numpy 的 where
函数。
i = df.Trend
df['Count'] = np.where(i.eq(i.shift()), i.eq(i.shift()).astype(int).cumsum().add(1),1)
输出
df
A B C B_shifted C_shifted Trend Count
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562 562 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511 511 Up 1
8 574.333333 552.00 580.00 548 590.50 Flat 1
9 537.500000 513.25 574.50 552 580 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531 565 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556 598 Down 1
我有一个这样的数据框
A B C B_shifted C_shifted Trend
0 553.666667 533.50 574.00 NaN NaN Flat
1 590.818182 575.50 595.50 533.50 574.00 Up
2 531.333333 527.50 536.50 575.50 595.50 Down
3 562.000000 562.00 562.00 527.50 536.50 Up
4 551.857143 538.50 557.50 562.00 562.00 Down
5 592.000000 585.50 598.50 538.50 557.50 Up
6 511.000000 511.00 511.00 585.50 598.50 Down
7 564.333333 548.00 590.50 511.00 511.00 Up
8 574.333333 552.00 580.00 548.00 590.50 Flat
9 537.500000 513.25 574.50 552.00 580.00 Down
10 609.500000 582.25 636.75 513.25 574.50 Up
11 535.000000 531.00 565.00 582.25 636.75 Down
12 567.142857 539.50 588.50 531.00 565.00 Up
13 566.625000 546.25 594.25 539.50 588.50 Up
14 576.631579 556.00 598.00 546.25 594.25 Up
15 558.333333 538.00 584.00 556.00 598.00 Down
我正在尝试创建一个列来计算趋势发生的次数。如果相同的趋势持续存在(例如从上到上,计数变为 2),它将递增,如果趋势发生变化(例如,从上到下,计数再次变为 1),它将重置回 1
这就是我想要达到的目标
A B C B_shifted C_shifted Trend Counter
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574.00 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562.00 562.00 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511.00 511.00 Up 1
8 574.333333 552.00 580.00 548.00 590.50 Flat 1
9 537.500000 513.25 574.50 552.00 580.00 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531.00 565.00 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556.00 598.00 Down 1
有办法吗?
您可以 shift()
the Trend
column to get trending indexes and then cumsum()
在热门组中:
trending = df.Trend.eq(df.Trend.shift())
df['Counter'] = trending.groupby(trending).cumsum().add(1)
输出:
A B C B_shifted C_shifted Trend Counter
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574.00 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562.00 562.00 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511.00 511.00 Up 1
8 574.333333 552.00 580.00 548.00 590.50 Flat 1
9 537.500000 513.25 574.50 552.00 580.00 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531.00 565.00 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556.00 598.00 Down 1
您可以使用 shift()
将值与以前的值进行比较,如果值相同,您可以使用 cumsum().add(1)
(因为默认值是从 0 开始),包含在numpy 的 where
函数。
i = df.Trend
df['Count'] = np.where(i.eq(i.shift()), i.eq(i.shift()).astype(int).cumsum().add(1),1)
输出
df
A B C B_shifted C_shifted Trend Count
0 553.666667 533.50 574.00 NaN NaN Flat 1
1 590.818182 575.50 595.50 533.50 574 Up 1
2 531.333333 527.50 536.50 575.50 595.50 Down 1
3 562.000000 562.00 562.00 527.50 536.50 Up 1
4 551.857143 538.50 557.50 562 562 Down 1
5 592.000000 585.50 598.50 538.50 557.50 Up 1
6 511.000000 511.00 511.00 585.50 598.50 Down 1
7 564.333333 548.00 590.50 511 511 Up 1
8 574.333333 552.00 580.00 548 590.50 Flat 1
9 537.500000 513.25 574.50 552 580 Down 1
10 609.500000 582.25 636.75 513.25 574.50 Up 1
11 535.000000 531.00 565.00 582.25 636.75 Down 1
12 567.142857 539.50 588.50 531 565 Up 1
13 566.625000 546.25 594.25 539.50 588.50 Up 2
14 576.631579 556.00 598.00 546.25 594.25 Up 3
15 558.333333 538.00 584.00 556 598 Down 1