我正在尝试将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)
但是这些要么抛出异常,要么返回与我期望不同的表。我只想过滤,而不是计算新表。
答案 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]
计时: