为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas groupby 然后删除低于指定大小的组

Pandas groupby 然后删除低于指定大小的组

森林海 2021-11-02 15:03:25
我正在尝试将 DataFrame 分成组并将组删除到最小大小(小异常值)以下。这是我尝试过的:df.groupby(['A']).filter(lambda x: x.count() > min_size)df.groupby(['A']).filter(lambda x: x.size() > min_size)df.groupby(['A']).filter(lambda x: x['A'].count() > min_size)df.groupby(['A']).filter(lambda x: x['A'].size() > min_size)但是这些要么抛出异常,要么返回与我预期不同的表。我只想过滤,而不是计算新表。
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

您可以使用len:


In [11]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['A', 'B'])


In [12]: df.groupby('A').filter(lambda x: len(x) > 1)

Out[12]:

   A  B

0  1  2

1  1  4


查看完整回答
反对 回复 2021-11-02
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

行数在属性中.shape[0]

df.groupby('A').filter(lambda x: x.shape[0] >= min_size)

注意:如果要删除小于最小尺寸的组,请保留大于或处于最小尺寸(>=,不是>)的组。


查看完整回答
反对 回复 2021-11-02
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

groupby.filter对于较大的数据集/大量组,可能会非常慢。更快的方法是使用groupby.transform:


下面是一个例子,首先创建数据集:


import pandas as pd

import numpy as np


df = pd.concat([

    pd.DataFrame({'y': np.random.randn(np.random.randint(1,5))}).assign(A=str(i)) 

    for i in range(1,1000)

]).reset_index(drop=True)

print(df)

             y    A

0     1.375980    1

1    -0.023861    1

2    -0.474707    1

3    -0.151859    2

4    -1.696823    2

...        ...  ...

2424  0.276737  998

2425 -0.142171  999

2426 -0.718891  999

2427 -0.621315  999

2428  1.335450  999


[2429 rows x 2 columns]

计时:

//img1.sycdn.imooc.com//6180e2e50001e0ad10790242.jpg

查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 143 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号