一个常见的SQL主义是"从表中选择A,意味着(X)A",我想在熊猫中复制它.假设数据存储在类似CSV文件的内容中,并且太大而无法加载到内存中.
如果CSV可以适合内存,一个简单的双线程就足够了:
data=pandas.read_csv("report.csv")
mean=data.groupby(data.A).mean()
Run Code Online (Sandbox Code Playgroud)
当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()
Run Code Online (Sandbox Code Playgroud)
除了生成的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
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?这看起来非常复杂......我宁愿写一个逐行处理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
Run Code Online (Sandbox Code Playgroud)
我会做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
Run Code Online (Sandbox Code Playgroud)
与非块版本相比:
df = pd.read_csv('foo.csv')
print df.groupby('id')['val'].mean()
id
A 7.272727
B 6.000000
C 7.333333
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3318 次 |
| 最近记录: |