Есть ли функция Python для +1 к значению в столбце, если она такая же, как в предыдущей строке, чтобы последовательность увеличивалась? - PullRequest
2 голосов
/ 07 августа 2020

У меня есть данные временного ряда, которые я хотел бы изменить, если есть одинаковые значения.

...

df = [{'period':'1', 'period_secs':1},
{'period':'1', 'period_secs':2},
{'period':'1', 'period_secs':3}
{'period':'1', 'period_secs':3},
{'period':'1', 'period_secs':3},
{'period':'1', 'period_secs':4}]

...

дает мне:

|period   |period_secs|
|    1    |     2     |
|    1    |     3     |
|    1    |     3     |
|    1    |     3     |
|    1    |     4     |
|    1    |     8     |

Я хотел бы добавить новый столбец, который продолжит последовательность, чтобы номер не дублировался и всегда увеличивался. Что даст мне

|period   |period_secs|period_secs_new|
|    1    |     2     |       2       |
|    1    |     3     |       3       |
|    1    |     3     |       4       |
|    1    |     3     |       5       |
|    1    |     4     |       6       |
|    1    |     8     |       8       |

Любая помощь будет принята с благодарностью

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Одно решение с накоплением:

    from itertools import accumulate

    def index_count(sum_, new_val):
        return new_val if new_val > sum_ else sum_ + 1

    df['period_secs_new'] = list(accumulate(df['period_secs'], func=index_count))

Вывод:

  period  period_secs  period_secs_new
0      1            1                1
1      1            2                2
2      1            3                3
3      1            3                4
4      1            3                5
5      1            6                6
6      1            8                8
0 голосов
/ 07 августа 2020

Вот решение, использующее eq и shift при использовании нового (в 3.8) Walrus-operator :

import pandas as pd

data = [{'period':'1', 'period_secs':2},
{'period':'1', 'period_secs':3},
{'period':'1', 'period_secs':3},
{'period':'1', 'period_secs':3},
{'period':'1', 'period_secs':4},
{'period':'1', 'period_secs':8}]

df = pd.DataFrame(data)

# Creating the new column to loop over
df["period_secs_new"] = df["period_secs"]

# A while-loop that is True while there are still
# consecutive values that are the same
while any(d:= df.period_secs_new.eq(df.period_secs_new.shift())):
    df.loc[d, ("period_secs_new",)] = df.loc[d, ("period_secs_new",)].apply(lambda x: x+1)
print(df)

Вывод:

  period  period_secs  period_secs_new
0      1            2                2
1      1            3                3
2      1            3                4
3      1            3                5
4      1            4                6
5      1            8                8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...