Pandas groupby然后将组降到指定大小以下

时间:2019-02-08 00:11:16

标签: python pandas

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

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

注意:如果要删除最小尺寸以下的组,请保留最小尺寸上方或的组(>=,而不是{ {1}}。

答案 2 :(得分:0)

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