Pandas按组分组,然后删除小于指定大小的组

9

我正在尝试将一个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个回答

14
你可以使用 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

2
谢谢。我没有意识到 filter 实际上返回的是原始 DataFrame(而不是分组后的 DataFrame)。因此,获取大小大于 N 的组的正确方法是 df.groupby('A').filter(lambda x: len(x) > N).groupby('A') - Caleb Jares

3

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]

计时:

timing


2

行数存储在属性.shape[0]中:

最初的回答

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

注意:如果您想删除小于最小大小的组,请保留大于或等于最小大小的组(>=,而不是>)。

最初的回答:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接