首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Pandas GroupBy并选择特定列中具有最小值的行

Pandas GroupBy并选择特定列中具有最小值的行
EN

Stack Overflow用户
提问于 2019-02-01 07:45:59
回答 4查看 17.5K关注 0票数 23

我按A列对数据集进行分组,然后希望在B列中取最小值,在C列中取相应的值。

代码语言:javascript
代码运行次数:0
运行
复制
data = pd.DataFrame({'A': [1, 2], 'B':[ 2, 4], 'C':[10, 4]})
data  
    A   B   C
0   1   4   3
1   1   5   4
2   1   2   10
3   2   7   2
4   2   4   4
5   2   6   6  

我想要得到:

代码语言:javascript
代码运行次数:0
运行
复制
    A   B   C
0   1   2   10
1   2   4   4

目前,我按A分组,并创建一个值来指示我将保留在数据集中的行:

代码语言:javascript
代码运行次数:0
运行
复制
a = data.groupby('A').min()
a['A'] = a.index
to_keep = [str(x[0]) + str(x[1]) for x in a[['A', 'B']].values]
data['id'] = data['A'].astype(str) + data['B'].astype('str')
data[data['id'].isin(to_keep)]

我相信有一种更直接的方法可以做到这一点。我在这里看到了许多使用多索引的答案,但我希望在不向我的数据框架添加多索引的情况下这样做。谢谢你的帮助。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-01 08:04:00

我觉得你想太多了。只需使用groupbyidxmin即可

代码语言:javascript
代码运行次数:0
运行
复制
df.loc[df.groupby('A').B.idxmin()]

   A  B   C
2  1  2  10
4  2  4   4

代码语言:javascript
代码运行次数:0
运行
复制
df.loc[df.groupby('A').B.idxmin()].reset_index(drop=True)

   A  B   C
0  1  2  10
1  2  4   4
票数 36
EN

Stack Overflow用户

发布于 2019-12-15 18:50:14

有类似的情况,但具有更复杂的列标题(例如"B val"),在这种情况下需要这样:

代码语言:javascript
代码运行次数:0
运行
复制
df.loc[df.groupby('A')['B val'].idxmin()]
票数 4
EN

Stack Overflow用户

发布于 2021-09-23 23:25:51

我找到了一个更冗长的答案,但更有效的

以下是示例数据集:

代码语言:javascript
代码运行次数:0
运行
复制
data = pd.DataFrame({'A': [1,1,1,2,2,2], 'B':[4,5,2,7,4,6], 'C':[3,4,10,2,4,6]})
data

Out:
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6 

首先,我们将从groupby操作中获取序列的最小值:

代码语言:javascript
代码运行次数:0
运行
复制
min_value = data.groupby('A').B.min()
min_value

Out:
A
1    2
2    4
Name: B, dtype: int64

然后,我们将这一系列结果合并到原始数据帧上

代码语言:javascript
代码运行次数:0
运行
复制
data = data.merge(min_value, on='A',suffixes=('', '_min'))
data

Out:
   A  B   C  B_min
0  1  4   3      2
1  1  5   4      2
2  1  2  10      2
3  2  7   2      4
4  2  4   4      4
5  2  6   6      4

最后,我们只得到B等于B_min的行,并删除B_min,因为我们不再需要它。

代码语言:javascript
代码运行次数:0
运行
复制
data = data[data.B==data.B_min].drop('B_min', axis=1)
data

Out:
   A  B   C
2  1  2  10
4  2  4   4

我已经在非常大的数据集上对它进行了测试,这是我能够在合理的时间内使其工作的唯一方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54470917

复制
相关文章

相似问题

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