2014-10-01 7 views
0

У меня есть образец DataFrame как таковой:Получите последние данные из каждого элемента Pandas DataFrame с индексированием диапазона и столбцом даты?

df = pd.DataFrame(data=[('foo', datetime.date(2014, 10, 1)), 
         ('foo', datetime.date(2014, 10, 2)), 
         ('bar', datetime.date(2014, 10, 3)), 
         ('bar', datetime.date(2014, 10, 1))], 
        columns=('name', 'date')) 

который выглядит следующим образом:

name  date 
0 foo 2014-10-01 
1 foo 2014-10-02 
2 bar 2014-10-03 
3 bar 2014-10-01 

Я хочу, чтобы ограничить dataframe к только последний случай каждого элемента в столбце Имя, как Я делаю это?

я мог бы неловко (по крайней мере, я думаю, было бы неудобно) построить булевы объект Series, чтобы сделать это и передать его в DataFrame-х __getitem__, как это:

pd[latest_name] 

Как наиболее элегантно получить последняя запись для каждого элемента name?

+0

Хммм ... два повышений, два вниз. Интересно, почему? –

ответ

2

У коллеги был очень похожий вопрос.

С объектом DataFrame, как это:

name  date 
0 foo 2014-10-01 
1 foo 2014-10-02 
2 bar 2014-10-03 
3 bar 2014-10-01 

Вы можете сортировать по дате и затем удалить дубликаты, сохраняя последние из них, как это:

last = df.sort(columns=('date',)).drop_duplicates(cols=('name',), take_last=True) 
# note cols is deprecated in more recent versions of pandas, 
# and you should use subset='name' if available to you 

и last теперь:

name  date 
1 foo 2014-10-02 
2 bar 2014-10-03 

[2 rows x 2 columns] 

Но может быть предпочтительнее установить дату в качестве индекса, если мы сможем цит старые индексы, а затем просто сортировать по индексу:

df = df.set_index('date') 
df = df.sort_index() # inplace=True is deprecated, so must assign 

df теперь возвращает:

  name 
date   
2014-10-01 foo 
2014-10-01 bar 
2014-10-02 foo 
2014-10-03 bar 

Теперь просто взять последние элементы:

last_elements_frame = df.drop_duplicates(take_last=True) 

и last_elements_frame сейчас :

  name 
date   
2014-10-02 foo 
2014-10-03 bar