python – 链接分组,过滤和聚合

python – 链接分组,过滤和聚合,第1张

概述DataFrameGroupby.filter方法过滤组,并返回包含通过过滤器的行的DataFrame. 但是,如何在过滤后获取新的DataFrameGroupBy对象而不是DataFrame? 例如,假设我有一个带有两列A和B的DataFrame df.我想获得列A的每个值的列B的平均值,只要该组中至少有5行: # pandas 0.18.0# doesn't work because `fi 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 objectdf.groupby('A').filter(lambda x: len(x)>=5).mean()# works but slower and awkward to write because needs to groupby('A') twicedf.groupby('A').filter(lambda x: len(x)>=5).reset_index().groupby('A').mean()# works but more verbose than chaininggroups = 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  B0  5  01  3  32  7  93  3  54  2  45  7  66  8  87  1  68  7  79  8  1

一个示例过滤器应用程序,演示它可以处理数据.

gb = df.groupby('A')>>> gb.filter(lambda group: group.A.count() >= 3)   A  B2  7  95  7  68  7  7

以下是您的一些选择:

1)您也可以先根据值计数进行过滤,然后再进行分组.

vc = df.A.value_counts()>>> df.loc[df.A.isin(vc[vc >= 2].index)].groupby('A').mean()          BA          3  4.0000007  7.3333338  4.500000

2)在过滤器之前和之后执行两次groupby:

>>> (df.groupby('A',as_index=False)       .filter(lambda group: group.A.count() >= 2)       .groupby('A')       .mean())          BA          3  4.0000007  7.3333338  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'})          B3  4.0000007  7.3333338  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%%timeitvc = 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
总结

以上是内存溢出为你收集整理的python – 链接分组,过滤和聚合全部内容,希望文章能够帮你解决python – 链接分组,过滤和聚合所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1206513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存