假设我有一个如下所示的数据框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} }。任何指导表示赞赏。
答案 0 :(得分:2)
您可以使用iloc
查找每个组的n//2 -1
和n//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