我有一个数据框,其中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索引,然后直接从其他帧表中提取这些索引。
答案 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()