python – 链接分组,过滤和聚合
发布时间:2020-12-16 22:56:35 所属栏目:Python 来源:网络整理
导读:DataFrameGroupby.filter方法过滤组,并返回包含通过过滤器的行的DataFrame. 但是,如何在过滤后获取新的DataFrameGroupBy对象而不是DataFrame? 例如,假设我有一个带有两列A和B的DataFrame df.我想获得列A的每个值的列B的平均值,只要该组中至少有5行: # pand
DataFrameGroupby.filter方法过滤组,并返回包含通过过滤器的行的DataFrame.
但是,如何在过滤后获取新的DataFrameGroupBy对象而不是DataFrame? 例如,假设我有一个带有两列A和B的DataFrame df.我想获得列A的每个值的列B的平均值,只要该组中至少有5行: # pandas 0.18.0 # doesn't work because `filter` returns a DF not a GroupBy object df.groupby('A').filter(lambda x: len(x)>=5).mean() # works but slower and awkward to write because needs to groupby('A') twice df.groupby('A').filter(lambda x: len(x)>=5).reset_index().groupby('A').mean() # works but more verbose than chaining groups = df.groupby('A') groups.mean()[groups.size() >= 5] 解决方法
这是一些可重现的数据:
np.random.seed(0) df = pd.DataFrame(np.random.randint(0,10,(10,2)),columns=list('AB')) >>> df A B 0 5 0 1 3 3 2 7 9 3 3 5 4 2 4 5 7 6 6 8 8 7 1 6 8 7 7 9 8 1 一个示例过滤器应用程序,演示它可以处理数据. gb = df.groupby('A') >>> gb.filter(lambda group: group.A.count() >= 3) A B 2 7 9 5 7 6 8 7 7 以下是您的一些选择: 1)您也可以先根据值计数进行过滤,然后再进行分组. vc = df.A.value_counts() >>> df.loc[df.A.isin(vc[vc >= 2].index)].groupby('A').mean() B A 3 4.000000 7 7.333333 8 4.500000 2)在过滤器之前和之后执行两次groupby: >>> (df.groupby('A',as_index=False) .filter(lambda group: group.A.count() >= 2) .groupby('A') .mean()) B A 3 4.000000 7 7.333333 8 4.500000 3)假设你的第一个groupby返回组,你也可以过滤那些: d = {k: v for k,v in df.groupby('A').groups.items() if len(v) >= 2} # gb.groups.iteritems() for Python 2 >>> d {3: [1,3],7: [2,5,8],8: [6,9]} 这有点像黑客,但应该相对有效,因为你不需要重新组合. >>> pd.DataFrame({col: [df.ix[d[col],'B'].mean()] for col in d}).T.rename(columns={0: 'B'}) B 3 4.000000 7 7.333333 8 4.500000 时间为100k排 np.random.seed(0) df = pd.DataFrame(np.random.randint(0,(100000,columns=list('AB')) %timeit df.groupby('A',as_index=False).filter(lambda group: group['A'].count() >= 5).groupby('A').mean() 100 loops,best of 3: 18 ms per loop %%timeit vc = df.A.value_counts() df.loc[df.A.isin(vc[vc >= 2].index)].groupby('A').mean() 100 loops,best of 3: 15.7 ms per loop (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |