python – Pandas GroupBy CSV中大数据集的平均值
发布时间:2020-12-20 11:35:00 所属栏目:Python 来源:网络整理
导读:一个常见的SQL主义是“从表中选择A,意味着(X)A”,我想在熊猫中复制它.假设数据存储在类似CSV文件的内容中,并且太大而无法加载到内存中. 如果CSV可以适合内存,一个简单的双线程就足够了: data=pandas.read_csv("report.csv")mean=data.groupby(data.A).mean(
一个常见的SQL主义是“从表中选择A,意味着(X)A”,我想在熊猫中复制它.假设数据存储在类似CSV文件的内容中,并且太大而无法加载到内存中.
如果CSV可以适合内存,一个简单的双线程就足够了: data=pandas.read_csv("report.csv") mean=data.groupby(data.A).mean() 当CSV无法读入内存时,可以尝试: chunks=pandas.read_csv("report.csv",chunksize=whatever) cmeans=pandas.concat([chunk.groupby(data.A).mean() for chunk in chunks]) badMeans=cmeans.groupby(cmeans.A).mean() 除了生成的cmeans表包含A的每个不同值的重复条目,对于不同块中的A值的每个外观都有一个(因为read_csv的chunksize对分组字段一无所知).因此,最终的badMeans表有错误的答案……它需要计算加权平均值. 所以一种工作方法似乎是这样的: final=pandas.DataFrame({"A":[],"mean":[],"cnt":[]}) for chunk in chunks: t=chunk.groupby(chunk.A).sum() c=chunk.groupby(chunk.A).count() cmean=pandas.DataFrame({"tot":t,"cnt":c}).reset_index() joined=pandas.concat(final,cmean) final=joined.groupby(joined.A).sum().reset_indeX() mean=final.tot/final.cnt 我错过了什么吗?这看起来非常复杂……我宁愿写一个逐行处理CSV的for循环而不是处理它.一定有更好的方法. 解决方法
我想你可以做类似以下的事情,这对我来说似乎有点简单.我做了以下数据:
id,val A,2 A,5 B,4 A,2 C,9 A,7 B,6 B,1 B,4 C,6 A,10 A,11 C,12 A,4 B,5 C,7 C,8 B,9 B,10 B,11 A,20 我会做5块大块: chunks = pd.read_csv("foo.csv",chunksize=5) pieces = [x.groupby('id')['val'].agg(['sum','count']) for x in chunks] agg = pd.concat(pieces).groupby(level=0).sum() print agg['sum']/agg['count'] id A 7.272727 B 6.000000 C 7.333333 与非块版本相比: df = pd.read_csv('foo.csv') print df.groupby('id')['val'].mean() id A 7.272727 B 6.000000 C 7.333333 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |