2013-09-10 95 views
1

我有一個數據框,其中user_id存儲爲HDFStore中的索引frame_table。在這個HDF文件中也是另一個用戶帶着動作的表格。我想抓住1%用戶採取的所有行動。其過程如下:通過使用where索引從索引HDFStore中選擇行

#Get 1% of the user IDs 
df_id = store.select('df_user_id', columns = ['id']) 
1pct_users = rnd.sample(df_id.id.unique(), 0.01*len(df_id.id.unique())) 
df_id = df_id[df_id.id.isin(1pct_users)] 

現在我想回去拿所有的描述從frame_tables採取這些用戶的行爲相同建立索引df_user_id的附加信息。按照this examplethis question我也做了以下內容:

1pct_actions = store.select('df_actions', where = pd.Term('index', 1pct_users.index)) 

這僅僅提供了一個空的數據幀。事實上,如果我在之前的熊貓文檔中複製並粘貼示例,我也會得到一個空的數據框。最近大熊貓的Term有什麼變化?我是熊貓0.12。

我沒有被綁定到任何特定的解決方案。只要我可以從df_id表(快速)查找hdfstore索引,然後直接從其他框架表中提取這些索引。

回答

3

這裏是0.12的方法。在0.13中,哪裏可以是一個索引器(例如一組位置,所以這更容易,請參閱(使用where掩碼選擇)[http://pandas.pydata.org/pandas-docs/dev/io.html#根據一些其中

In [6]: c = store.select_as_coordinates('df', ['index<3']) 

當接受該座標的對象(和可以高級查詢],然後第二示例下來。

In [2]: df = DataFrame(dict(A=list(range(5)),B=list(range(5)))) 

In [3]: df 
Out[3]: 
    A B 
0 0 0 
1 1 1 
2 2 2 
3 3 3 
4 4 4 

In [4]: store = pd.HDFStore('test.h5',mode='w') 

In [5]: store.append('df',df) 

選擇並返回一個座標對象(只是一個纏繞位置陣列)使用它們與任何表,這裏將是你的'df_action'表)

In [7]: store.select('df', where=c) 
Out[7]: 
    A B 
0 0 0 
1 1 1 
2 2 2 

In [8]: c 
Out[8]: <pandas.io.pytables.Coordinates at 0x4669590> 

In [9]: c.values 
Out[9]: array([0, 1, 2]) 

如果你想操縱這個,那麼只需在傳遞到select之前將你想要的位置分配給座標對象。 (正如我上面所說,這個'黑客'在0.13消失了,你不需要這個中間對象)

In [8]: c.values = np.array([0,1]) 

In [9]: store.select('df', where=c) 
Out[9]: 
    A B 
0 0 0 
1 1 1 

store.close() 
+0

完美的答案。我誤解了where參數的格式,並沒有意識到它需要像這個座標那樣結構化。我認爲它可能是一個鬆散的定義,作爲一個數組,列表等進行提供......感謝您清除它。 – cwharland

+0

如果能夠成爲0.13中的列表/數組。 – Jeff