2013-12-03 2 views
0

У меня есть временный фреймворк pandas, который имеет дату, заданную как индекс, и количество столбцов (один - cusip).Groupby в pandas timeseries dataframe, выбирая последнее событие

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

Я пытался использовать GroupBy:

newData = [] 
for group in df.groupby(df['CUSIP']): 
    newData.append(group[group.index == max(group.index)]) 

'builtin_function_or_method' object is not iterable 


In [374]: df.head() 
Out[374]: 
       CUSIP  COLA   COLB  COLC 
date               
1992-05-08 AAA   238   4256  3.523346 
1992-07-13 AAA   234   4677  3.485577 
1992-12-12 BBB   221   5150  3.24 
1995-12-12 BBB   254   5150  3.25 
1997-12-12 BBB   245   6150  3.25 
1998-12-12 CCC   234   5140  3.24145 
1999-12-12 CCC   223   5120  3.65145 

Я хочу:

   CUSIP  COLA   COLB  COLC 
date   
1992-07-13 AAA   234   4677  3.485577  
1997-12-12 BBB   245   6150  3.25 
1999-12-12 CCC   223   5120  3.65145 

Должен ли я подойти к этому еще один способ? Спасибо.

+0

Pls разместить образец ваш набор данных и результат выборки – Jeff

+0

добавлен - спасибо – user1911092

ответ

3
In [17]: df 
Out[17]: 
      cusip a  b   c 
date         
1992-05-08 AAA 238 4256 3.523346 
1992-07-13 AAA 234 4677 3.485577 
1992-12-12 BBB 221 5150 3.240000 
1995-12-12 BBB 254 5150 3.250000 
1997-12-12 BBB 245 6150 3.250000 
1998-12-12 CCC 234 5140 3.241450 
1999-12-12 CCC 223 5120 3.651450 

[7 rows x 4 columns] 

разбирайтесь

In [18]: df = df.sort_index() 

In [19]: df 
Out[19]: 
      cusip a  b   c 
date         
1992-05-08 AAA 238 4256 3.523346 
1992-07-13 AAA 234 4677 3.485577 
1992-12-12 BBB 221 5150 3.240000 
1995-12-12 BBB 254 5150 3.250000 
1997-12-12 BBB 245 6150 3.250000 
1998-12-12 CCC 234 5140 3.241450 
1999-12-12 CCC 223 5120 3.651450 

[7 rows x 4 columns] 

Возьмите последний элемент из каждой группы

In [20]: df.groupby('cusip').last() 
Out[20]: 
     a  b   c 
cusip      
AAA 234 4677 3.485577 
BBB 245 6150 3.250000 
CCC 223 5120 3.651450 

[3 rows x 3 columns] 

Если вы хотите сохранить индекс даты, сброс первой, группы, затем установите индекс обратно

In [9]: df.reset_index().groupby('cusip').last().reset_index().set_index('date') 
Out[9]: 
      cusip a  b   c 
date         
1992-07-13 AAA 234 4677 3.485577 
1997-12-12 BBB 245 6150 3.250000 
1999-12-12 CCC 223 5120 3.651450 

[3 rows x 4 columns] 
+0

С таким подходом я потерял дату. Нужно ли сначала сбросить индекс? – user1911092

+0

обновлено ... не видел, что вам нужен индекс – Jeff

+0

Я бы конвертировал в datetime, чтобы вы избегали проблем при сортировке строк (особенно если месяцы/дни не имеют ведущих 0) – mkln

1

Я сделал это путь дата

df = pd.read_csv('/home/desktop/test.csv') 

новообращенный DateTime

df = df.reset_index() 
df['date'] = pd.to_datetime(df['date']) 

рода dataframe так, как вы хотите

df = df.sort(['CUSIP','date'], ascending=[True,False]).groupby('CUSIP') 

определить, что происходит, когда вы агрегировать (в соответствии с тем, как вы отсортированный)

def return_first(pd_series): 
    return pd_series.values[0] 

сделать Dict применить ту же функцию для всех столбцов

agg_dict = {c: return_first for c in df.columns} 

наконец агрегатных

df = df.agg(agg_dict) 

EDIT: преобразование даты в DateTime позволяет избежать такого рода ошибки:

In [12]: df.sort(['CUSIP','date'],ascending=[True,False]) 
Out[12]: 
     date CUSIP COLA COLB  COLC   date_time 

6 1999-12-12 CCC 223 5120 3.651450 1999-12-12 00:00:00 
5 1998-12-12 CCC 234 5140 3.241450 1998-12-12 00:00:00 
8 1997-12-4 DDD 999 9999 9.999999 1997-12-04 00:00:00 
9 1997-12-05 DDD 245 6150 3.250000 1997-12-05 00:00:00 
7 1992-07-6 DDD 234 4677 3.485577 1992-07-06 00:00:00 
Смежные вопросы