Совокупное количество дней с использованием столбца индикатора - PullRequest
1 голос
/ 25 марта 2019

Я хочу сгенерировать новую переменную "Counter" в Python, которая подсчитывает количество дней с момента последнего значения 1 в столбце "Dummy".Данные сортируются по датам, а затем по идентификаторам.Если у идентификатора ранее не было значения 1 в «Пустышке», счетчик должен дать значение -1. ​​

Исходные данные выглядят как первые 3 столбца ниже.Четвертый столбец «Счетчик» - это желаемый результат / переменная, которая должна быть добавлена ​​в фрейм данных panda:

Date        ID Dummy Counter

2017-10-01   1   0   -1

2017-12-31   1   1   -1

2017-12-31   2   1   -1

2018-01-15   2   0   15

2018-01-25   1   0   25

2018-02-01   1   1   32

2018-02-02   1   0    1

Заранее спасибо!

1 Ответ

0 голосов
/ 26 марта 2019

Существует векторизованное решение с использованием groupby + apply:

Разбейте его на 2 строки, чтобы сделать его более понятным, но оно все еще немного запутано:

Чтение ваших данных:

s = '''Date        ID Dummy
2017-10-01   1   0
2017-12-31   1   1
2017-12-31   2   1
2018-01-15   2   0
2018-01-25   1   0
2018-02-01   1   1
2018-02-02   1   0'''

df = pd.DataFrame.from_csv(io.StringIO(s), sep='\s+', index_col=None)
df['Date'] = pd.to_datetime(df['Date'])

Предлагаемое решение:

last_valid = lambda gdf: (gdf['Date'] - gdf['Date'].where(gdf['Dummy']==1, np.nan).ffill().shift(1))
df['Counter'] = df.groupby('ID').apply(last_valid).reset_index('ID', drop=True).dt.days.fillna(-1)

Вывод:

    Date    ID  Dummy   Counter
0   2017-10-01  1   0   -1.0
1   2017-12-31  1   1   -1.0
2   2017-12-31  2   1   -1.0
3   2018-01-15  2   0   15.0
4   2018-01-25  1   0   25.0
5   2018-02-01  1   1   32.0
6   2018-02-02  1   0   1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...