加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读