首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python代码,以便分组并返回在数据中找到的所有匹配项

Python代码,以便分组并返回在数据中找到的所有匹配项
EN

Stack Overflow用户
提问于 2018-12-06 06:09:56
回答 1查看 57关注 0票数 1

假设我的数据是:

代码语言:javascript
复制
my_list=[[0,'A',10,12,14],
         [0,'A',10,13,15],
         [0,'A',8,12,13],
         [0,'A',9,13,17],
         [0,'A',8,11,15],
         [0,'B',9,5,7],
         [0,'B',11,5,9],
         [0,'B',8,7,8],
         [1,'A',11,14,9],
         [0,'B',8,10,14],
         [1,'B',11,6,6],
         [1,'A',10,5,9]
         [1,'B',9,6,6]]

my_frame=pd.DataFrame(my_list, columns=['id','quality','grade','characteristic 1','characteristic 2'])

我的目标是根据“id”和“quality”对我的数据进行分组,使用评分作为感兴趣的最大值和最小值。所以我编写了代码:

代码语言:javascript
复制
my_group=np.array(my_frame.groupby(['id','quality'])['grade']
         .agg(["max grade", max],["min grade", min])
         .reset_index())

到目前为止还不错,但我还没有弄清楚如何处理我真正需要的信息:

我想分组并获取所有出现最大和最小等级的情况,以及该行的所有信息。换句话说,目前为我工作的代码是这样的:

代码语言:javascript
复制
print(my_group)

输出:

代码语言:javascript
复制
[[0,'A',10,8],
 [0,'B',11,8],
 [1,'A',11,10],
 [1,'B',11,9]]

然而,我感兴趣的是带来这种输出:

代码语言:javascript
复制
[[0,'A',10,12,14],
 [0,'A',10,13,15],
 [0,'A',8,12,13],
 [0,'A',8,11,15],
 [0,'B',11,5,9],
 [0,'B',8,7,8],
 [0,'B',8,10,14],
 [1,'A',11,14,9],
 [1,'A',10,5,9],
 [1,'B',11,6,6],
 [1,'B',9,6,6]]

为了尽可能清楚,groupby将为我提供每个“id”和每个“quality”的最大和最小“等级”,但我实际上需要知道其余的信息(“特征1”和“特征2”),即我获得这个最大和最小“等级”的信息,而不管最大“等级”和最小“等级”出现了多少次。

你能指导我完成这件事吗?我希望我的问题是清楚的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-06 06:39:15

更新的解决方案,我认为你需要这个:

代码语言:javascript
复制
my_frame[my_frame.groupby(['id','quality'])['grade']\
                 .transform(lambda x: (x == x.min()) | (x == x.max()))]\
                 .sort_values(['id','quality'])

输出:

代码语言:javascript
复制
    id quality  grade  characteristic 1  characteristic 2
0    0       A     10                12                14
1    0       A     10                13                15
2    0       A      8                12                13
4    0       A      8                11                15
6    0       B     11                 5                 9
7    0       B      8                 7                 8
9    0       B      8                10                14
8    1       A     11                14                 9
11   1       A     10                 5                 9
10   1       B     11                 6                 6
12   1       B      9                 6                 6

然后,转换为二维数组:

代码语言:javascript
复制
my_frame[my_frame.groupby(['id','quality'])['grade']\
                 .transform(lambda x: (x == x.min()) | (x == x.max()))]\
                 .sort_values(['id','quality']).values.tolist()

输出:

代码语言:javascript
复制
[[0, 'A', 10, 12, 14],
 [0, 'A', 10, 13, 15],
 [0, 'A', 8, 12, 13],
 [0, 'A', 8, 11, 15],
 [0, 'B', 11, 5, 9],
 [0, 'B', 8, 7, 8],
 [0, 'B', 8, 10, 14],
 [1, 'A', 11, 14, 9],
 [1, 'A', 10, 5, 9],
 [1, 'B', 11, 6, 6],
 [1, 'B', 9, 6, 6]]

IIUC,您希望将groupby聚合的结果连接回原始数据帧:

代码语言:javascript
复制
my_frame.merge(my_frame.groupby(['id','quality'])['grade']
                       .agg(['max','min', lambda x: x.max()-x.min()]), 
               left_on=['id','quality'], 
               right_index=True).values.tolist()

输出:

代码语言:javascript
复制
[[0, 'A', 10, 12, 14, 10, 8, 2],
 [0, 'A', 10, 13, 15, 10, 8, 2],
 [0, 'A', 8, 12, 13, 10, 8, 2],
 [0, 'A', 9, 13, 17, 10, 8, 2],
 [0, 'A', 8, 11, 15, 10, 8, 2],
 [0, 'B', 9, 5, 7, 11, 8, 3],
 [0, 'B', 11, 5, 9, 11, 8, 3],
 [0, 'B', 8, 7, 8, 11, 8, 3],
 [0, 'B', 8, 10, 14, 11, 8, 3],
 [1, 'A', 11, 14, 9, 11, 11, 0],
 [1, 'B', 11, 6, 6, 11, 11, 0]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53641513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档