2016-12-01 53 views
0

DF:逐组获取最后的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:]确实让我em列的最后3个元素,为什么不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_indexrenamelevel_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