我正在尝试理解下面提供的内容(这是我在网上找到的,但并不完全理解)。我想从本质上删除至少 4 次未出现在我的数据框中的用户名(除了删除这些名称外,我不想以任何其他方式修改数据框)。下面的代码是否解决了这个问题?如果是的话,你能解释一下过滤器与 lambda 结合是如何实现的吗?我有以下内容:
df.groupby('userName').filter(lambda x: len(x) > 4)
我也愿意接受易于理解的替代解决方案/方法。
可以查看filtration .
在更大的 DataFrame
中更快的解决方案是使用 transform
和 boolean 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
我是一名优秀的程序员,十分优秀!