使用where在索引中从HDFStore中选择行

时间:2013-09-10 21:58:54

标签: python pandas hdfstore

我有一个数据框,其中user_ids存储为HDFStore中的索引frame_table。此HDF文件中还有另一个表,其中包含用户执行的操作。我想抓住1%用户采取的所有行动。程序如下:

#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相同。根据{{​​3}}和this example,我完成了以下操作:

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

这只是提供一个空数据框。事实上,如果我复制并粘贴上一个pandas doc this question中的示例,我也会获得一个空数据框。最近的大熊猫中有Term的变化吗?我的熊猫0.12。

我不依赖于任何特定的解决方案。只要我可以从df_id表(快速)上的查找中获取hdfstore索引,然后直接从其他帧表中提取这些索引。

1 个答案:

答案 0 :(得分:3)

这是在0.12中执行此操作的方法。在0.13中,where可以是一个索引器(例如,一个位置数组,所以这更容易,请参阅(选择使用where掩码)[http://pandas.pydata.org/pandas-docs/dev/io.html#高级查询],然后是第二个例子。

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)

根据某些

选择并返回一个坐标对象(只是一个包裹的位置数组)
In [6]: c = store.select_as_coordinates('df', ['index<3'])

在哪里接受Coordinate对象(你可以在任何表中使用它们,这里就是你的'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之前将你想要的位置分配给Coordinate对象。 (正如我上面所说,这个'黑客'在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()