熊猫:如何在每组中获取前2行,中2行和后2行

时间:2018-11-15 03:33:29

标签: pandas pandas-groupby

假设我有一个如下所示的数据框df。为了获得每个组的第一名和第二名,我使用了groupby.nth

df = pd.DataFrame({'A': ['a','a','a','a','a','a','a','a','b','b','b','b','b','b','b'],
                   'B': [1, 2, 3, 4, 5,6,7,8,1, 2, 3, 4, 5,6,7]}, columns=['A', 'B'])
df.groupby('A').nth([0,1,-2,-1])

结果:

    B
A   
a   1
a   2
a   7
a   8
b   1
b   2
b   6
b   7

我不确定如何获取中间的2行。例如,在'A'组中有8个实例,因此我的中间行将是4, 5 (n/2, n/2+1),而在'B'组中我的中间行将是3, 4 {{1} }。任何指导表示赞赏。

2 个答案:

答案 0 :(得分:2)

您可以使用iloc查找每个组的n//2 -1n//2索引(//是楼层划分):

g = df.groupby('A')

g.apply(lambda x: x['B'].iloc[[len(x)//2-1, len(x)//2]])

A    
a  3     4
   4     5
b  10    3
   11    4
Name: B, dtype: int64

答案 1 :(得分:2)

sacul's answer很不错,这里我只是按照您的想法定义自定义功能

def middle(x):
     if len(x) % 2 == 0:
         return x.iloc[int(len(x) / 2) - 1:int(len(x) / 2) + 1]
     else:
         return x.iloc[int((len(x) / 2 - 0.5)) - 1:int(len(x) / 2 + 0.5)]

pd.concat([middle(y) for _ , y in df.groupby('A')])
Out[25]:
    A  B
3   a  4
4   a  5
10  b  3
11  b  4