Выберите подмножество данных, используя условие для мультииндекса - PullRequest
0 голосов
/ 10 мая 2018

All

У меня есть кадр данных в следующем формате:

ind date value1 value2 x1 23-04-2018 1.3 7.2 x1 03-05-2018 4.6 3.5 x2 04-04-2018 2.0 8.5

ind и date - индексы. Если для одного значения ind имеется несколько строк, я хочу сохранить только самую последнюю дату.

Итак, в моем примере предпочтительный результат:

ind date value1 value2 x1 03-05-2018 4.6 3.5 x2 04-04-2018 2.0 8.5

Столбец даты представлен в формате datetime, поэтому поиск максимальной даты в группах может сработать. Но возможно ли использовать такое условие, например, в сочетании с groupby (например, GROUPBY и HAVING в SQL). Или есть лучший метод?

У кого-нибудь есть решение или советы?

Редактировать: я немного изменил свой пример. Несколько строк не обязательно являются дубликатами.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Несколько многословный метод, который не требует сортировки:

# Gets the row indices as list of lists
idx = df.reset_index('date', drop=False) \
    .groupby('ind', sort=False)['date'] \
    .max() \
    .iteritems()

df.loc(axis=0)[list(idx)]

Это зависит от порядка ['idx', 'date'] в df.

0 голосов
/ 10 мая 2018

Вы можете использовать sort_index и удалять дубликаты.

Где df сначала не имеет индексов:

print(df)

  ind       date  value1  value2
0  x1 2018-04-23     1.3     7.2
1  x1 2018-03-05     1.3     7.2
2  x2 2018-04-04     2.0     8.5

df.set_index(['ind','date']).sort_index(level=[1], ascending=[False]).drop_duplicates()

Или как @piRSquare гласит:

df.set_index(['ind','date']).sort_index(level=[1]).drop_duplicates(keep='last')

Выход:

                value1  value2
ind date                      
x1  2018-04-23     1.3     7.2
x2  2018-04-04     2.0     8.5
...