фильтровать и расширять временные ряды pandas данных - PullRequest
1 голос
/ 29 апреля 2020

Этот вопрос является дополнением к этому вопросу: фильтр многоиндексированных сгруппированных pandas dataframe

Я хотел бы получить timestamp, где value начинает увеличиваться ноль после date как новый столбец new_date для каждого отдельного человека id

Пример Входные данные:

id timestamp  date       value
1  2001-01-01 2001-05-01 1
1  2001-10-01 2001-05-01 0
1  2001-10-02 2001-05-01 1
1  2001-10-03 2001-05-01 0
1  2001-10-04 2001-05-01 1
2  2001-01-01 2001-05-01 1
2  2001-10-01 2001-05-01 0
2  2001-10-02 2001-05-01 0
2  2001-10-03 2001-05-01 0
2  2001-10-04 2001-05-01 1

Требуется Пример выходных данных:

id timestamp  date       value new_date
1  2001-01-01 2001-05-01 1     2001-10-02
1  2001-10-01 2001-05-01 0     2001-10-02
1  2001-10-02 2001-05-01 1     2001-10-02
1  2001-10-03 2001-05-01 0     2001-10-02
1  2001-10-04 2001-05-01 1     2001-10-02
2  2001-01-01 2001-05-01 1     2001-10-04
2  2001-10-01 2001-05-01 0     2001-10-04
2  2001-10-02 2001-05-01 0     2001-10-04
2  2001-10-03 2001-05-01 0     2001-10-04
2  2001-10-04 2001-05-01 1     2001-10-04

1 Ответ

1 голос
/ 29 апреля 2020

Более простое решение, работающее также, если в какой-то группе нет совпадений, это первый фильтр. DataFrame Маска в цепочке для большего, например date на Series.gt с побитовым AND, то же самое для 0, затем удалите дублирует DataFrame.drop_duplicates, создает Series и последний раз использует Series.map:

df['timestamp'] = pd.to_datetime(df['timestamp'])
df['date'] = pd.to_datetime(df['date'])
df = df.sort_values(['id','timestamp'])

m = df['timestamp'].gt(df['date']) & df['value'].gt(0)

s = df[m].drop_duplicates('id').set_index('id')['timestamp']

df['new_date'] = df['id'].map(s)
print (df)
   id  timestamp       date  value   new_date
0   1 2001-01-01 2001-05-01      1 2001-10-02
1   1 2001-10-01 2001-05-01      0 2001-10-02
2   1 2001-10-02 2001-05-01      1 2001-10-02
3   1 2001-10-03 2001-05-01      0 2001-10-02
4   1 2001-10-04 2001-05-01      1 2001-10-02
5   2 2001-01-01 2001-05-01      1 2001-10-04
6   2 2001-10-01 2001-05-01      0 2001-10-04
7   2 2001-10-02 2001-05-01      0 2001-10-04
8   2 2001-10-03 2001-05-01      0 2001-10-04
9   2 2001-10-04 2001-05-01      1 2001-10-04
...