2013-05-15 3 views
2

У меня есть кадр данных Pandas, df1, который является годичным 5 минут тайм-аутами с колонками A-Z.Pandas: фантазия индексирования DataFrame

df1.shape 
(105121, 26) 
df1.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-02 00:00:00] 
Length: 105121, Freq: 5T, Timezone: None 

У меня есть второй dataframe, df2, то есть годичная ежедневно таймсерия (за тот же период) с соответствующими столбцами. Значения этого второго кадра являются булевыми.

df2.shape 
(365, 26) 
df2.index 
<class 'pandas.tseries.index.DatetimeIndex'> 
[2002-01-02 00:00:00, ..., 2003-01-01 00:00:00] 
Length: 365, Freq: D, Timezone: None 

Я хочу использовать df2 как фантазии индекса df1, т.е. «df1.ix [df2]» или сконвертировано, так что я получаю обратно подмножество столбцов df1 по каждой дате - т.е. те, которые df2 говорит, что в эту дату True (со всеми отметками времени). Таким образом, форма результата должна быть (105121, ширина), где width - количество различных столбцов, которые подразумевают булевы (ширина < = 26).

В настоящее время df1.ix [df2] работает только частично. Выбраны только значения 00:00 за каждый день, что имеет смысл в свете временных рядов df2.

Затем я попытался время охватывает как индекс df2:

df2.index 
PeriodIndex: 365 entries, 2002-01-02 to 2003-01-01 

На этот раз, я получаю сообщение об ошибке:

/home/wchapman/.local/lib/python2.7/site-packages/pandas-0.11.0-py2.7-linux-x86_64.egg/pandas/core/index.pyc in get_indexer(self, target, method, limit) 
    844    this = self.astype(object) 
    845    target = target.astype(object) 
--> 846    return this.get_indexer(target, method=method, limit=limit) 
    847 
    848   if not self.is_unique: 

AttributeError: 'numpy.ndarray' object has no attribute 'get_indexer' 

Моя временное решение заключается в цикле по дате, но это, кажется неэффективным. Возможно, Панды способны на такую ​​причудливую индексацию? Я не вижу примеров в документации.

+0

Вы можете ресэмплировать 'df2' до 5 минут и заполнить Это. – joris

+0

Спасибо, должен был упомянуть, что я тоже это пробовал. Got ValueError: невозможно индексировать с помощью многомерного ключа. – Will

ответ

0

Вот один из способов сделать это:

t_index = df1.index 
d_index = df2.index 
mask = t_index.map(lambda t: t.date() in d_index) 
df1[mask] 

и немного быстрее (но с той же идеей) было бы использовать:

mask = pd.to_datetime([datetime.date(*t_tuple) 
          for t_tuple in zip(t_index.year, 
               t_index.month, 
               t_index.day)]).isin(d_index) 
+0

'.date', вероятно, был бы полезным методом для DatetimeIndex (я думаю, я соберу его вместе). –

+0

Добавлено как [pull request] (https://github.com/pydata/pandas/pull/3614). :) –

+0

Спасибо Энди, но моя проблема немного сложнее. Мне нужно использовать (boolean) _values_ из df2, а не индекс, как индекс причудливости к df1, как в следующем (numpy): a = np.arange (5) b = np.asarray ([True False, True, False, True]) a [b] ---> аранжировка ([0, 2, 4]). Как бы то ни было, ваш код выше возвращает весь df1, потому что datetime из df1 находятся внутри дней df2. Мне нужно, чтобы возвращались правильные _columns_ of df1, то есть те, которые были идентифицированы по True в соответствующих столбцах df2. И этот выбор будет меняться в зависимости от дня. – Will