2013-09-10 3 views
1

У меня есть кадр данных с user_ids, который хранится как индексированная frame_table в HDFStore. Также в этом файле HDF есть еще одна таблица с действиями, которые пользователь взял. Я хочу захватить все действия, предпринятые 1% пользователей. Процедура выглядит следующим образом:Выбор строк из 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 example и this question я сделал следующее:

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

Это просто обеспечивает пустой кадр данных. На самом деле, если я скопирую и вставлю пример в предыдущий pandas doc link, я также получаю пустой фрейм данных. Что-то изменилось около Term в последних пандах? Я на пандах 0.12.

Я не привязан к какому-либо конкретному решению. Пока я могу получить индексы hdfstore из поиска в таблице df_id (что быстро), а затем напрямую вытащить эти индексы из других таблиц фреймов.

ответ

3

Вот как это сделать в 0.12. В 0.13, где может быть указатель (например, массив местоположений, так что это намного проще, см. (Выбор с использованием маски где)) [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']) 

где принимает координаты объектов (и вы можете используйте их с любой таблицей, здесь будет ваша таблица «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

Смежные вопросы