如何创建根据另一列中的字符串值计数和重置的新列

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