Pandas GroupBy 借助 CSV 中的大型数据集

2023-11-27

一个常见的 SQLism 是“从 A 的表组中选择 A,平均值(X)”,我想在 pandas 中复制它。假设数据存储在 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,2
C,4
C,4
A,6
A,9
A,10
A,11
C,12
A,4
A,4
B,6
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

与非 chunk 版本相比:

df = pd.read_csv('foo.csv')
print df.groupby('id')['val'].mean()

id
A     7.272727
B     6.000000
C     7.333333
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas GroupBy 借助 CSV 中的大型数据集 的相关文章

随机推荐