Если у вас есть гигантский фрейм данных вы не можете захотеть сделать groupby
только, чтобы получить представление о данных. Вот еще одно решение для получения первых пяти строк внешнего индекса и первых двух строк внутреннего индекса.
df = pd.DataFrame({'year': [2010, 2010, 2010, 2011,2011,2011, 2012, 2012, 2013, 2013, 2014, 2014],
'username': ['b','a','a','c','c','d','e','f','g','i','h','j'],
'count': [400, 505, 678, 677, 505, 505, 677, 505, 677, 505, 677, 505]})
df = df.set_index(['year','username'])
Обратите внимание, что DataFrame
должен быть отсортирован.
df = df.sort_index(level=[0,1])
df
count
year username
2010 a 505
a 678
b 400
2011 c 677
c 505
d 505
2012 e 677
f 505
2013 g 677
i 505
2014 h 677
j 505
Теперь для магии:
def head_mi(df, n1=5, n2=2):
#get top n of outer index
top_lev_0 = df.index.levels[0].values[:n1]
#get top n of inner index
top_lev_1 = [df.loc[ind].index.values[:n2] for ind in top_lev_0 ]
#top_lev_1 is a list of the inner index values
#iterate over outer index and get slice from inner index
acc = []
for count0, ind0 in enumerate(top_lev_0):
acc.append(df.loc[(top_lev_0[count0], slice(top_lev_1[count0][0], top_lev_1[count0][-1])),:])
return pd.concat(acc)
head_mi(df)
Это дает:
count
year username
2010 a 505
a 678
2011 c 677
c 505
2012 e 677
f 505
2013 g 677
i 505
2014 h 677
j 505
При вызове 'головка (2)' на вашем GroupBy она должна дать вам первые 2 строки в каждой группе – EdChum
Почему метки '['h', 'j']' для 2014 в ожидаемом выходе, а не '['a', 'b']'? –