Pandas GroupBy и средний диапазон дат - PullRequest
0 голосов
/ 20 января 2019

Я хотел бы вычислить среднее значение для каждого идентификатора, используя groupby и mean.Тем не менее, мне нужны только строки, где Date находится между годами 2016-01-01 и 2017-12-31.

d = {'ID': ['STCK123', 'STCK123', 'STCK123'], 'Amount': [250, 400, 350], 
     'Date': ['2016-01-20', '2017-09-25', '2018-05-15']}



data = pd.DataFrame(data=d)
data = data[['ID', 'Amount', 'Date']]

data['Date'] = pd.to_datetime(data['Date'])

Это дает следующее df:

    ID  Amount    Date
STCK123 250 2016-01-20
STCK123 400 2017-09-25
STCK123 350 2018-05-15

Когда я использую:

data.groupby(['ID'])['Amount'].agg('mean')

Учитывает все строки, что приводит к среднему значению 333.3.Как я могу исключить строки, где Date равно 2018 (получая среднее значение (250+400)/2=325)?

1 Ответ

0 голосов
/ 20 января 2019

Вам понадобится этап предварительной фильтрации с query:

df.query('Date.dt.year != 2018').groupby('ID').mean()

         Amount
ID             
STCK123     325

Больше вариантов использования eval, query, и связанные параметры можно найти здесь в моей записи: Оценка динамических выражений в пандах с использованием pd.eval ()

См. здесь , чтобы узнать больше о отбрасывании строк перед вызовом groupby.


Вы также можете mask эти строки, без необходимости их отбрасывать.NaN исключаются из агрегации GroupBy.

df.mask(df.Date.dt.year == 2018).groupby('ID').mean()

         Amount
ID             
STCK123   325.0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...