Group By大数据集的操作

时间:2014-12-19 04:31:22

标签: python pandas pandas-groupby

是否有一种简单的方法/模块可以在python中对数据集进行分组操作,因为数据集太大而无法放入内存中?

我通常会使用pandas,但它会因大型数据集而崩溃。

2 个答案:

答案 0 :(得分:5)

在评论中,@ steboc提到使用sqlite作为可能的解决方案。您可以使用任何数据库作为后端,但sqlite相当快,几乎不需要设置。这是一个将一堆垃圾写入sqlite然后以组的形式阅读的例子:

首先加载一些软件包并设置环境:

import pandas as pd
import sqlite3
import string


## connect to a db. This db will be created if it does not exist
conn = sqlite3.connect('example.db')
c = conn.cursor()

np.random.seed(123)
## create some random data in a pandas dataframe
n = 1000000
c = 10

让我们循环30次,每次我们创建一个包含1毫米记录,10个数字字段和一个简单字母的密钥的数据框。我们在sqlite数据库中戳这个数据帧。在循环结束时,我们的数据库中将有30毫米的行。我的MBP需要大约15分钟:

%%time
for i in arange(30):
    df = pd.DataFrame(np.random.randn(n, c), columns=list(map(chr, range(65, 65+c))))
    df['key'] = string.ascii_letters[i]
    df.to_sql(name='test_table', if_exists='append', con=conn)

现在,如果我们要按字段key中的值对所有这些数据分组进行操作,我们首先需要获取密钥的所有唯一值。一种方法是这样做:

%%time
keys_df = pd.read_sql(sql='SELECT DISTINCT key FROM test_table', con=conn)
keys_df

现在我们有keys_df这是一个数据框,其中一列包含`key'的所有唯一值。现在我们可以遍历每个组并从数据库中仅提取该组并执行分组操作。这里的例子做了一个简单的describe():

%%time
for row in keys_df.iterrows():
    tempdf = pd.read_sql(sql='SELECT * FROM test_table WHERE key=\'' + row[1][0] + '\';', con=conn)
    ## do anything you want with your group here. 
    ## we'll print describe just for fun
    print tempdf.describe()
    print ""

显然,在现实生活中,您将值放在数据结构中。

我希望这有助于说明如何使用sqlite和pandas迭代数据组。

答案 1 :(得分:3)

Blaze项目很乐意通过分块数据集然后在每个块上使用Pandas来管理大型数据集。 Blaze out-of-core docs可能会让您感兴趣。这是纽约出租车数据集中的explicit example

如果您更喜欢较慢的纯python解决方案,那么toolz项目可能会让您感兴趣。以下是streaming analytics

上的文件