Обработка данных Python: как сгруппировать по идентификатору, а затем подмножить строки вперед/назад на 1 месяц в зависимости от условий времени данных в каждой группе?

Я хочу подмножить данные после groupby и подмножить строки вперед и назад на 1 месяц по условиям времени данных.

Вот тестовый фрейм данных:


import pandas as pd
from itertools import chain


df_1 = pd.DataFrame({
        'ID' : list(chain.from_iterable([['A'] * 365, ['B'] * 365, ['C'] * 365])),
        'Date' : pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist() + pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist() + pd.date_range(start = '2018-01-01', end = '2018-12-31').tolist(),
        'Value' : np.random.randn(365 * 3)
        })

df_2 = pd.DataFrame({
        'ID' : ['A', 'B', 'C'],
        'Initial_date' : pd.to_datetime(['2018-04-24', '2018-09-22', '2018-12-12'], format = '%Y-%m-%d')
        })


df = pd.merge(df_1, df_2, how = 'left', left_on = 'ID', right_on = 'ID')

вывод тестового фрейма данных:

  ID       Date  Value Initial_date
0  A 2018-01-01 -1.084   2018-04-24
1  A 2018-01-02  0.585   2018-04-24
2  A 2018-01-03  0.812   2018-04-24
3  A 2018-01-04 -1.115   2018-04-24
4  A 2018-01-05 -1.724   2018-04-24

Итак, вот что я хочу иметь:

Для пользователя A его initial date — это 2018-04-24, поэтому я хочу иметь все строки от 1 месяца назад, то есть 2018-03-24, до 1 месяца вперед, то есть 2018-05-24. А также пользователи B и C.

Результат должен быть таким же, как

df_a = df[(df['ID'] == 'A') & (df['Date'] > '2018-03-23') & (df['Date'] < '2018-05-25')]

df_b = df[(df['ID'] == 'B') & (df['Date'] > '2018-08-21') & (df['Date'] < '2018-10-23')]

df_c = df[(df['ID'] == 'C') & (df['Date'] > '2018-11-11') & (df['Date'] < '2018-12-31')]


df_result = pd.concat([df_a, df_b, df_c])

df_result.head() это

   ID       Date  Value Initial_date
82  A 2018-03-24 -1.013   2018-04-24
83  A 2018-03-25 -0.023   2018-04-24
84  A 2018-03-26 -0.053   2018-04-24
85  A 2018-03-27 -1.091   2018-04-24
86  A 2018-03-28  1.839   2018-04-24

Примечание *1: Дата на полях не обязательно включает или исключает точную дату. Например, для A, из 2018-03-23 или 2018-03-24 для меня не имеет значения.

Примечание *2: Для пользователей C дата пересылки меньше 1 месяца, так как его initial date включен 2018-12-12, поэтому до конца 2018 года все в порядке.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC, вы можете попробовать следующее:

# set 1-month interval
delta = pd.DateOffset(months=1) 

# get the subset
df_result = df[df.Date.gt(df.Initial_date-delta) & df.Date.lt(df.Initial_date+delta)] 

Это решение элегантно и удивительно! Я думаю, что буду использовать это в исходном наборе данных. Тем не менее, я также пытаюсь добиться того же результата, используя groupby, так как я пытаюсь понять логику и использование groupby в Python, надеюсь, будут ответы с использованием groupby.

J.D 29.05.2019 06:38

Другие вопросы по теме