从数据框中删除未出现一定次数的用户名?

时间:2017-06-02 06:37:54

标签: python pandas dataframe filtering grouping

我想了解下面提供的内容(我在网上找到,但不完全了解)。我想基本上删除至少4次没有出现在我的数据框中的用户名(除了删除这些名称,我不想以任何其他方式修改数据框)。下面的代码是否解决了这个问题?如果是这样,你能解释一下滤波器与lambda的结合是如何实现的吗?我有以下内容:

df.groupby('userName').filter(lambda x: len(x) > 4)

我也愿意接受易于理解的替代解决方案/方法。

2 个答案:

答案 0 :(得分:2)

您可以查看filtration

DataFrame更大的解决方案是transformboolean indexing

df[df.groupby('userName')['userName'].transform('size') > 4]

样品:

df = pd.DataFrame({'userName':['a'] * 5 + ['b'] * 3 + ['c'] * 6})

print (df.groupby('userName').filter(lambda x: len(x) > 4))
   userName
0         a
1         a
2         a
3         a
4         a
8         c
9         c
10        c
11        c
12        c
13        c

print (df[df.groupby('userName')['userName'].transform('size') > 4])
   userName
0         a
1         a
2         a
3         a
4         a
8         c
9         c
10        c
11        c
12        c
13        c

<强>计时

np.random.seed(123)
N = 1000000
L = np.random.randint(1000,size=N).astype(str)
df = pd.DataFrame({'userName': np.random.choice(L, N)})
print (df)

In [128]: %timeit (df.groupby('userName').filter(lambda x: len(x) > 1000))
1 loop, best of 3: 468 ms per loop

In [129]: %timeit (df[df.groupby('userName')['userName'].transform(len) > 1000])
1 loop, best of 3: 661 ms per loop

In [130]: %timeit (df[df.groupby('userName')['userName'].transform('size') > 1000])
10 loops, best of 3: 96.9 ms per loop

答案 1 :(得分:1)

使用numpy

def pir(df, k):
    names = df.userName.values
    f, u = pd.factorize(names)
    c = np.bincount(f)
    m = c[f] > k
    return df[m]

pir(df, 4)

   userName
0         a
1         a
2         a
3         a
4         a
8         c
9         c
10        c
11        c
12        c
13        c

__

<强>时序
@ jezrael的大数据

np.random.seed(123)
N = 1000000
L = np.random.randint(1000,size=N).astype(str)
df = pd.DataFrame({'userName': np.random.choice(L, N)})

pir(df, 1000).equals(
    df[df.groupby('userName')['userName'].transform('size') > 1000]
)

True

%timeit df[df.groupby('userName')['userName'].transform('size') > 1000]
%timeit pir(df, 1000)

10 loops, best of 3: 78.4 ms per loop
10 loops, best of 3: 61.9 ms per loop