首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >满足一定条件的数据帧去重

满足一定条件的数据帧去重
EN

Stack Overflow用户
提问于 2018-09-11 07:36:24
回答 2查看 33关注 0票数 2

我有以下数据框

代码语言:javascript
复制
my_id  field_1   field_2   field_3 ...  field_100
1         :
1         :      
1
1 
2
2
3
3
3

我希望使用具有非空的最小field_1的记录,为每个my_id只保留一行。除了遍历整个数据帧之外,有没有一种优雅的方法来实现这一点呢?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-09-11 07:37:59

IIUC:

代码语言:javascript
复制
df.sort_values(['myid','field_1']).drop_duplicates(['my_id'])

这之所以有效,是因为默认情况下,sort_values将空值放在最后,而drop_duplicates保留第一个空值。因此,如果按field_1对其进行排序,则第一个值将是最低的非空值。

示例:

代码语言:javascript
复制
>>> df
   myid  field_1   field_2
0     1      NaN  0.832445
1     1      3.0  0.742906
2     1      2.0  0.392163
3     2      2.0  0.089412
4     2      NaN  0.815754
5     2      1.0  0.615426

>>> df.sort_values(['myid','field_1']).drop_duplicates(['myid'])
   myid  field_1   field_2
2     1      2.0  0.392163
5     2      1.0  0.615426

另一种方法是排序,然后使用groupby并选择first (但我认为效率较低):

代码语言:javascript
复制
>>> df.sort_values('field_1').groupby('myid', as_index=False).first()
   myid  field_1   field_2
0     1      2.0  0.392163
1     2      1.0  0.615426
票数 1
EN

Stack Overflow用户

发布于 2018-09-11 08:22:41

您可以使用idxmin,因为它已经兼顾了NaN(不考虑)和min (将被挑选)

代码语言:javascript
复制
df.loc[df.groupby('myid').field_1.idxmin()]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52266809

复制
相关文章

相似问题

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