我有一个多级指数熊猫DataFrame,第一级是year,第二级是username。我只有一个列,它已经按降序方式排序了。我想显示每个索引级别0的前2行。
我有什么
count
year username
2010 b 677
a 505
c 400
d 300
...
2014 a 100
b 80我想要什么
count
year username
2010 b 677
a 505
2011 c 677
d 505
2012 e 677
f 505
2013 g 677
i 505
2014 h 677
j 505发布于 2015-09-13 21:57:43
这是一个答案。也许有更好的方法来做到这一点(索引?),但我认为它是有效的。这一原则似乎很复杂,但相当简单:
DataFrame。DataFrame分组,这是索引的第一级(=0)。DataFrame获得的子groupby上应用两个操作(每年一次) sort_index(by='count'),->,具有更多计数的行将位于DataFrame的尾部[-top:])保留最后的[-top:]行(在本例中为2行)。还可以使用tail方法(tail(top))来提高可读性。
droplevel(0)创建的不必要级别# Test data
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'])
top = 2
df = df.groupby(level=0).apply(lambda df: df.sort_index(by='count')[-top:])
df.index = df.index.droplevel(0)
df
count
year username
2010 a 505
a 678
2011 d 505
c 677
2012 f 505
e 677
2013 i 505
g 677
2014 j 505
h 677发布于 2020-03-20 09:01:54
我遇到了同样的问题,在文档中找到了一个更清晰的答案(熊猫1.0.1版):GroupBy:取每组的第一行。下面是一个技巧,假设您的数据被称为df
df.groupby(level=0).head(2)发布于 2017-06-30 21:20:39
如果您有一个巨大的数据框架,您可能不想做一个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 https://stackoverflow.com/questions/32553626
复制相似问题