2013-03-17 25 views
1

問題:如何創建一個允許迭代pandas HDFStore對象中多個列的生成器?HDFStore select_as_multiple生成器

我想創建一個熊貓HDFStore對象的包裝類。我試圖實現的功能之一是能夠通過給定的chunksize遍歷HDFStore中的各組列。許多機器學習算法可以運行on-line,並且不需要一次全部數據。

我第一次嘗試是創造一個發電機的功能,並通過啓動和停止參數到HDFStore的選擇方法:

def iterate(self, key, chunksize=50000): 
    node = self.store.get_node(key) 
    nrows = node.table.nrows 
    current = 0 
    while current < nrows: 
     yield self.store.select(key, start=current, stop=current+chunksize) 
     current += chunksize 

這工作得很好,我能遍歷存儲在商店中的列。請注意,爲了測試,我將每列存儲在自己的表中。

我的下一步是使用HDFStore.select_as_multiple將此概念擴展到多個表中的多個列。雖然沒有在文檔字符串,select_as_multiple似乎接受start,stop參數,以及:被退回

>>> store.select_as_multiple(keys='MachineID', start=0, stop=50000) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 50000 entries, 0 to 49999 
Data columns: 
MachineID 50000 non-null values 
dtypes: int64(1) 

只有50,000行,按要求。然而,當我經過1個多鍵/列的方法拉回的所有行:

>>> store.select_as_multiple(keys=['MachineID','YearMade'], start=0, stop=50000) 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 401125 entries, 0 to 1124 
Data columns: 
MachineID 401125 non-null values 
YearMade  401125 non-null values 
dtypes: int64(2) 

是否有可能使用select_as_multiple給拉了回來,而不是行的所有行的指定範圍內?

版本信息:

>>> pd.__version__ 
'0.10.1' 

>>> tables.__version__ 
'2.4.0' 

回答

2

它不工作,因爲沒有通過START/STOP鍵的基本選擇。很容易修復。

也一直想添加迭代器的支持,要偷你的函數:)

https://github.com/pydata/pandas/issues/3078

有文檔,但本質:

for df in store.select('df',chunksize=10000): 
    print df 
+0

的Wooo!我對這個真棒項目的第一個貢獻。感謝您的幫助。 – Zelazny7 2013-03-17 19:01:53

+0

歡迎打開公關如果你想:) – Jeff 2013-03-17 19:06:36

+0

完成,請參閱上面的公關鏈接,請試一試,讓我知道這是如何工作。這個還沒有合併,但是現在這個是 – Jeff 2013-03-18 01:17:12