按组获取系列的最后n个元素?

时间:2016-12-01 16:07:24

标签: pandas data-manipulation

DF:

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 :(得分:1)

我认为您需要groupby功能GroupBy.tail,最后需要DataFrame reset_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