Отредактировано сейчас. Смотрите оригинал.

я из R, код будет

x       <- data.frame(vals = c(100,100,100,100,100,100,200,200,200,200,200,200,200,300,300,300,300,300))
x$state <- cumsum(c(1, diff(x$vals) != 0))

Который отмечает каждый раз, когда разница между строками не равна нулю, так что я могу использовать его для определения переходов в данных, например, так:

   vals state
1   100     1
...
7   200     2
...
14  300     3

Что будет чистым эквивалентом в Python?

Дополнительный вопрос

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

Данные здесь:https://pastebin.com/gEmPHAb7, Обратите внимание, что есть 2 разных имени файла.

При импорте какdf_all Я сгруппировал это со следующим, и затем применяю решение, отправленное ниже.

df_grouped = df_all.groupby("filename")
df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum()
 lukeA18 сент. 2017 г., 11:17
Может просто подражать?import pandas as pd;import numpy as np;x = pd.DataFrame({'vals': [100,100,100,100,100,100,200,200,200,200,200,200,200,300,300,300,300,300]});x['state'] = np.cumsum(np.insert(np.diff(x.vals) != 0, 0, 1));x, Я не знаю, если это "чистый" эквивалент Python, хотя.

Ответы на вопрос(1)

Решение Вопроса

С помощьюdiff а такжеcumsum, как в вашемR пример:

df['state'] = (df['vals'].diff()!= 0).cumsum()

Это использует тот факт, чтоTrue имеет целочисленное значение, е 1

Бонусный вопрос
df_grouped = df_all.groupby("filename")
df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum()

Я думаю, что вы неправильно поняли, чтоgroupby делает. Все, что делает groupby - это создает группы на основе критерия (filename в этом случае). Затем вам нужно сказать добавить еще одну операцию, чтобы сказать, что должно произойти с этой группой. Общие операцииmean, sumили более продвинутый, какapply а такжеtransform, Вы можете найти больше информацииВот или жеВот

Если вы сможете более подробно объяснить, чего вы хотите достичь с помощью группы, я могу помочь вам найти правильный метод. Если вы хотите выполнить вышеуказанную операцию для каждого имени файла, вам, вероятно, понадобится что-то вроде этого:

def get_state(group):
    return (group.diff()!= 0).cumsum()

df_all['state'] = df_all.groupby('filename')['Fit'].transform(get_state)
 komodovaran_20 сент. 2017 г., 11:56
Сначала я делаю группу,df_grouped = df_all.groupby("filename") а затем я применяю вышеупомянутое решение, в новом столбцеdf_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum() Тем не менее, похоже, чтоcumsum полностью игнорировал группировку.
 komodovaran_20 сент. 2017 г., 12:10
Отредактировано сейчас. Смотрите оригинал.
 Maarten Fabré20 сент. 2017 г., 11:51
Я не вижу причин, по которым это не сработает на сгруппированном DataFrame. Я не вижу никакого кода, поэтому я не могу судить о синтаксической ошибке
 komodovaran_20 сент. 2017 г., 11:49
Благодарю. Дополнительный вопрос: есть ли причина, по которой это не должно работать на сгруппированных пандах df, или у меня ошибка синтаксиса?

Ваш ответ на вопрос