Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CSV中大数据集的平均值_Python_Pandas - Fatal编程技术网

Python CSV中大数据集的平均值

Python CSV中大数据集的平均值,python,pandas,Python,Pandas,一个常见的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) cme

一个常见的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

我错过什么了吗?这看起来非常复杂。。。我宁愿编写一个for循环,逐行处理CSV,也不愿处理这个问题。一定有更好的办法。

我想你可以做下面这样的事情,这对我来说似乎有点简单。我提供了以下数据:

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
与非区块版本相比:

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

id
A     7.272727
B     6.000000
C     7.333333

谢谢,那当然更好。。。虽然一点也不明显(还有一些关于ints溢出的担忧)。希望将来的熊猫版本能让这更容易;这是一个有点不平凡的正确做;只是需要一个积极的贡献者!