2014-12-19 48 views
4

有沒有一種簡單的方法/模塊可以在Python中對數據集進行分組操作,因爲數據集太大而不適合內存?Group對於大型數據集的操作

我通常會使用熊貓,但它打破了大型數據集。

+0

[this](http://stackoverflow.com/questions/773/how-do-i-use-pythons-itertools-groupby)和[this](https:// docs。 python.org/2/library/itertools.html)可能會有所幫助。 – Ujjwal 2014-12-19 05:04:03

+1

也許你可以使用sqlite3.exe來聚合核心外的數據 – steboc 2014-12-19 10:15:42

回答

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這是用含有'關鍵」的所有唯一值一列的數據幀。現在我們可以遍歷每個組,並從數據庫中僅提取該組並從中進行分組操作。這裏的例子確實微不足道的描述():

%%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和熊貓來遍歷數據組。

3

Blaze項目很樂意通過分塊數據集,然後在每個塊上使用Pandas來管理大型數據集。 Blaze out-of-core docs可能會讓你感興趣。這裏是NYC Taxi數據集上的explicit example

如果您更喜歡較慢的純python解決方案,那麼toolz項目可能會讓您感興趣。這裏是它的文檔streaming analytics

+0

不推薦使用僅鏈接答案的好例子。這些鏈接中只有三分之一持續了18個月的間隔。也許:http://blaze.readthedocs.io/en/latest/index.html – 2016-07-09 16:21:47

相關問題