2016-12-01 2 views
0

ДФ:Получение последних n элементов серии по группам?

d = pd.DataFrame({'tic': ['B', 'C', 'A', 'A', 'C', 'A', 'A', 'B','B', 'C', 'A', 'A'], 
        'em': [10, 5, np.nan, 5, np.nan, np.nan, 12, np.nan, 12, 7, 
          5, np.nan], 
        'C':[1,4,np.nan,2, 7, np.nan, 7, 9,7, np.nan, 7, 9]} 
        ) 

d.set_index(['tic'], inplace=True, drop=False) 
d.sort_index(level=0, inplace=True) 

Если d['em'][-3:] действительно получает меня 3 последние элементы столбца em, почему не d['em'][-3:].groupby(level=0) получить меня последние 3, группа?

Кроме того, почему d['em'][-3:].groupby('tic') даст:

KeyError: 'tic'?

Я думал level=0 и 'tic' может быть использован как в этом случае, на основе:

In[40]: d.index.names 
Out[40]: FrozenList(['tic', 'None']) 
+1

Рассмотрите возможность добавления примерных данных, чтобы сделать ваш пример проще. –

+0

Только что добавленные данные образца – st19297

ответ

1

Я думаю, что вам нужно groupby с функцией GroupBy.tail, последний для DataFramereset_index и rename колонке level_1:

print (d.groupby(level='tic')['em'].tail(3)) 
tic    
A 1971-09-30 12.0 
    1972-09-30  5.0 
    1972-12-31  NaN 
B 1970-03-31 10.0 
    1971-12-31  NaN 
    1972-03-31 12.0 
C 1970-06-30  5.0 
    1971-03-31  NaN 
    1972-06-30  7.0 
Name: em, dtype: float64 

d1 = d.groupby(level='tic')['em'].tail(3).reset_index().rename(columns={'level_1':'date'}) 
print (d1) 
    tic  date em 
0 A 1971-09-30 12.0 
1 A 1972-09-30 5.0 
2 A 1972-12-31 NaN 
3 B 1970-03-31 10.0 
4 B 1971-12-31 NaN 
5 B 1972-03-31 12.0 
6 C 1970-06-30 5.0 
7 C 1971-03-31 NaN 
8 C 1972-06-30 7.0 
Смежные вопросы