Как отобразить значения пересечения синусоиды в DataFrame?
Нужно получить 2 столбца на основе второго с числами. Эти значения идут синусоидой. Когда происходит пересечение 80 и значения уменьшаются до 20, пишем в новый столбец '1'. Когда происходит движение от 20 до 80, пишем в еще один столбец значение '2' (до момента когда оно выйдет за 80).
Ввод:
20200402 10.04901961
20200402 17.89215686
20200402 21.56862745
20200402 29.41176471
20200402 50.98039216
20200402 74.50980392
20200402 83.59133127
20200402 80.49535604
20200402 68.42105263
20200402 52.63157895
20200402 26.31578947
20200402 17.27395412
20200402 20.51282051
20200402 25.64102564
20200402 17.94871795
20200402 9.991158267
20200402 14.05835544
20200402 16.09195402
Итог:
20200402 10.04901961 2
20200402 17.89215686 2
20200402 21.56862745 2
20200402 29.41176471 2
20200402 50.98039216 2
20200402 74.50980392 2
20200402 83.59133127 1
20200402 80.49535604 1
20200402 68.42105263 1
20200402 52.63157895 1
20200402 26.31578947 1
20200402 17.27395412 1
20200402 20.51282051 1
20200402 25.64102564 1
20200402 17.94871795 2
20200402 9.991158267 2
20200402 14.05835544 2
20200402 16.09195402 2
Ответы (1 шт):
Автор решения: MaxU
→ Ссылка
Попробуйте так:
mask1 = df[1].shift().fillna(50).le(80) & df[1].gt(80)
mask2 = df[1].shift().fillna(50).gt(20) & df[1].le(20)
df.loc[mask2, "new"] = 2
df.loc[mask1, "new"] = 1
df["new"] = df["new"].ffill()
Результат:
In [88]: df
Out[88]:
0 1 new
0 20200402 10.049020 2.0
1 20200402 17.892157 2.0
2 20200402 21.568627 2.0
3 20200402 29.411765 2.0
4 20200402 50.980392 2.0
5 20200402 74.509804 2.0
6 20200402 83.591331 1.0
7 20200402 80.495356 1.0
8 20200402 68.421053 1.0
9 20200402 52.631579 1.0
10 20200402 26.315789 1.0
11 20200402 17.273954 2.0
12 20200402 20.512821 2.0
13 20200402 25.641026 2.0
14 20200402 17.948718 2.0
15 20200402 9.991158 2.0
16 20200402 14.058355 2.0
17 20200402 16.091954 2.0