Group By大数据集的操作

Ale*_*ont 4 python pandas pandas-groupby

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

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

JD *_*ong 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
Run Code Online (Sandbox Code Playgroud)

让我们循环30次,每次我们创建一个包含1mm记录,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)
Run Code Online (Sandbox Code Playgroud)

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

%%time
keys_df = pd.read_sql(sql='SELECT DISTINCT key FROM test_table', con=conn)
keys_df
Run Code Online (Sandbox Code Playgroud)

现在我们有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 ""
Run Code Online (Sandbox Code Playgroud)

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

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