![](/img/trans.png)
[英]Pandas groupby - apply different functions to half the records in each group
[英]Find half of each group with Pandas GroupBy
我需要使用groupby
来选择数据帧的一半,其中每个组的大小是未知的,并且可能随组的不同而变化。 例如:
index summary participant_id
0 130599 17.0 13
1 130601 18.0 13
2 130603 16.0 13
3 130605 15.0 13
4 130607 15.0 13
5 130609 16.0 13
6 130611 17.0 13
7 130613 15.0 13
8 130615 17.0 13
9 130617 17.0 13
10 86789 12.0 14
11 86791 8.0 14
12 86793 21.0 14
13 86795 19.0 14
14 86797 20.0 14
15 86799 9.0 14
16 86801 10.0 14
20 107370 1.0 15
21 107372 2.0 15
22 107374 2.0 15
23 107376 4.0 15
24 107378 4.0 15
25 107380 7.0 15
26 107382 6.0 15
27 107597 NaN 15
28 107384 14.0 15
组从尺寸groupyby('participant_id')
是10,7,9为participant_id
13,14,15分别。 我需要的只是每组的第一半(或楼板数(N / 2))。
根据我对Pandas groupby
经验(非常有限),应该是这样的:
df.groupby('participant_id')[['summary','participant_id']].apply(lambda x: x[:k_i])
其中k_i
是每组大小的一半。 有找到k_i
的简单解决方案吗?
IIUC,您可以在lambda内部使用大小为// 2的索引切片:
df.groupby('participant_id').apply(lambda x: x.iloc[:x.participant_id.size//2])
输出:
index summary participant_id
participant_id
13 0 130599 17.0 13
1 130601 18.0 13
2 130603 16.0 13
3 130605 15.0 13
4 130607 15.0 13
14 10 86789 12.0 14
11 86791 8.0 14
12 86793 21.0 14
15 20 107370 1.0 15
21 107372 2.0 15
22 107374 2.0 15
23 107376 4.0 15
您可以按participant_id
ID分组,并使用transform
方法检查其索引是否在前半部分。 这将创建一个布尔系列。 然后使用此布尔系列过滤掉原始数据框。
criteria = df.groupby('participant_id')['participant_id']\
.transform(lambda x: np.arange(len(x)) < int(len(x) / 2))
df[criteria]
index summary participant_id
0 130599 17.0 13
1 130601 18.0 13
2 130603 16.0 13
3 130605 15.0 13
4 130607 15.0 13
10 86789 12.0 14
11 86791 8.0 14
12 86793 21.0 14
20 107370 1.0 15
21 107372 2.0 15
22 107374 2.0 15
23 107376 4.0 15
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.