2013-10-02 4 views
3

У меня есть dataframe с идентификаторами и временными метками в качестве мультииндекса. Индекс в dataframe сортируется по идентификаторам и временным меткам, и я хочу выбрать самую последнюю отметку времени для каждого идентификатора. например:Как получить доступ к последнему элементу мультииндекса Dataframe

IDs timestamp  value 
0  2010-10-30  1 
     2010-11-30  2 
1  2000-01-01  300 
     2007-01-01  33 
     2010-01-01  400 
2  2000-01-01  11 

Так в основном результат я хочу

IDs timestamp value 
0  2010-11-30 2 
1  2010-01-01 400 
2  2000-01-01 11 

Что такое команда, чтобы сделать это в панд?

ответ

4

Учитывая эту установку:

import pandas as pd 
import numpy as np 
import io 

content = io.BytesIO("""\ 
IDs timestamp  value 
0  2010-10-30  1 
0  2010-11-30  2 
1  2000-01-01  300 
1  2007-01-01  33 
1  2010-01-01  400 
2  2000-01-01  11""") 

df = pd.read_table(content, header=0, sep='\s+', parse_dates=[1]) 
df.set_index(['IDs', 'timestamp'], inplace=True) 

с использованием reset_index с последующим groupby

df.reset_index(['timestamp'], inplace=True) 
print(df.groupby(level=0).last()) 

урожайности

   timestamp value 
IDs       
0 2010-11-30 00:00:00  2 
1 2010-01-01 00:00:00 400 
2 2000-01-01 00:00:00  11 

Это не чувствует, как лучшее решение, однако. Там должен быть способ сделать это без вызова reset_index ...


Как вы отмечаете в комментариях, last игнорирует значения NaN. Для того, чтобы не пропустить значения NaN, вы могли бы использовать groupby/agg так:

df.reset_index(['timestamp'], inplace=True) 
grouped = df.groupby(level=0) 
print(grouped.agg(lambda x: x.iloc[-1])) 
+1

Проблема с этим решением заключается в том, что last() игнорирует NAN. Поэтому, если в последней строке есть NAN, ее игнорируют. – silencer

0

Можно также использовать

df.groupby("IDs").tail(1) 

Это займет последнюю строку каждой метки уровня «ИД» и не будет игнорировать NaN значения.

Смежные вопросы