我认为,在
v1和
v2没有
NaNS,所以使用
transform+
size:
df = df[df.groupby(['v1', 'v2'])['v2'].transform('size') == 6]print (df) v1 v2 v30 0 -30 -15.000001 0 -30 -7.500002 0 -30 -11.250003 0 -30 -13.125004 0 -30 -14.062505 0 -30 -13.593756 0 -10 -5.000007 0 -10 -7.500008 0 -10 -6.250009 0 -10 -5.6250010 0 -10 -5.9375011 0 -10 -6.09375
详情:
print (df.groupby(['v1', 'v2'])['v2'].transform('size') == 6)0 True1 True2 True3 True4 True5 True6 True7 True8 True9 True10 True11 True12 False13 False14 FalseName: v2, dtype: bool
不幸的
filter是真的很慢,因此如果需要更好的性能,请使用
transform:
np.random.seed(123)N = 1000000L = list('abcdefghijkl') df = pd.Dataframe({'v1': np.random.choice(L, N), 'v2':np.random.randint(10000,size=N), 'value':np.random.randint(1000,size=N), 'value2':np.random.randint(5000,size=N)})df = df.sort_values(['v1','v2']).reset_index(drop=True)print (df.head(10))In [290]: %timeit df.groupby(['v1', 'v2']).filter(lambda x: len(x) == 6)1 loop, best of 3: 12.1 s per loopIn [291]: %timeit df[df.groupby(['v1', 'v2'])['v2'].transform('size') == 6]1 loop, best of 3: 176 ms per loopIn [292]: %timeit df[df.groupby(['v1', 'v2']).v2.transform('count').eq(6)]10 loops, best of 3: 175 ms per loop
N = 1000000ngroups = 1000df = pd.Dataframe(dict(A = np.random.randint(0,ngroups,size=N),B=np.random.randn(N)))In [299]: %timeit df.groupby('A').filter(lambda x: len(x) > 1000)1 loop, best of 3: 330 ms per loopIn [300]: %timeit df[df.groupby(['A'])['A'].transform('size') > 1000]10 loops, best of 3: 101 ms per loop
警告
给定组数,结果不能解决性能问题,这对于其中一些解决方案的时序会产生很大影响。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)