2014-12-11 6 views
2

У меня есть кадр данных, содержащий ряд наблюдений:Переиндексировать dataframe нового диапазоном дат

date   colour  orders 
2014-10-20 red  7 
2014-10-21 red  10 
2014-10-20 yellow  3 

Я хотел бы переиндексацию кадра данных и стандартизировать даты.

date   colour  orders 
2014-10-20 red  7 
2014-10-21 red  10 
2014-10-22 red  NaN 
2014-10-20 yellow  3 
2014-10-21 yellow  NaN 
2014-10-22 yellow  NaN 

я хоть на заказ кадр данных по colour и date, а затем попытаться повторно индексировать его.

index = pd.date_range('20/10/2014', '22/10/2014') 
test_df = df.sort(['colour', 'date'], ascending=(True, True)) 
ts = test_df.reindex(index) 
ts 

Но она возвращает новый фрейм данных с правым указателем, но все NaN значения.

date   colour  orders 
2014-10-20 NaN  NaN 
2014-10-21 NaN  NaN 
2014-10-22 NaN  NaN 
+0

Что такое 'index' в вашем примере? – joris

+0

Привет, Джорис, я новичок в пандах. Я думаю, что исходный фрейм данных фактически не индексируется вообще. Я отсортировал его, но не установил индекс. – Gianluca

+0

Но я имею в виду, что вы используете переменную с именем 'index' в строке' ts = test_df.reindex (index) '. Так что же это? – joris

ответ

4

Начиная с вашего exampe dataframe:

In [51]: df 
Out[51]: 
     date colour orders 
0 2014-10-20  red  7 
1 2014-10-21  red  10 
2 2014-10-20 yellow  3 

Если вы хотите проиндексировать как на «даты» и «цвет», одна возможность заключается в том, чтобы установить как в качестве индекса (мульти-индекс) :

In [52]: df = df.set_index(['date', 'colour']) 

In [53]: df 
Out[53]: 
        orders 
date  colour 
2014-10-20 red   7 
2014-10-21 red   10 
2014-10-20 yellow  3 

Теперь вы можете индексировать эту dataframe, после того, как вы построили для требуемого индекса:

In [54]: index = pd.date_range('20/10/2014', '22/10/2014') 

In [55]: multi_index = pd.MultiIndex.from_product([index, ['red', 'yellow']]) 

In [56]: df.reindex(multi_index) 
Out[56]: 
        orders 
2014-10-20 red   7 
      yellow  3 
2014-10-21 red   10 
      yellow  NaN 
2014-10-22 red  NaN 
      yellow  NaN 

Чтобы иметь тот же результат, как ваш пример вывод, индекс должен быть отсортирован на втором уровне (level=1 как это с 0):

In [60]: df2 = df.reindex(multi_index) 

In [64]: df2.sortlevel(level=1) 
Out[64]: 
        orders 
2014-10-20 red   7 
2014-10-21 red   10 
2014-10-22 red  NaN 
2014-10-20 yellow  3 
2014-10-21 yellow  NaN 
2014-10-22 yellow  NaN 

Возможным способом автоматического создания мульти-индекса будет быть (с оригинальной рамкой):

pd.MultiIndex.from_product([pd.date_range(df['date'].min(), df['date'].max(), freq='D'), 
          df['colour'].unique()]) 

Другим способом будет использовать resample для каждой группы цветов:

In [77]: df = df.set_index('date') 

In [78]: df.groupby('colour').resample('D') 

Это проще, но это не дает вам полный диапазон дат для каждого цвета, только диапазон дат, доступных для этой группы цветов.

+0

Предположим, у меня есть тысячи продуктов (если честно, у меня также есть только один столбец, но один для категории, различные подкатегории и т. Д.), Как я могу изменить эту часть кода 'multi_index = pd.MultiIndex.from_product ([index, ['red', 'yellow']]) '? – Gianluca

+0

См. Мой «Возможный способ генерации мультииндекса автоматически ...», чтобы сделать это, когда в столбце «colour» есть много значений – joris

+0

@Gianluca. Это решило вашу проблему? Или есть проблемы? – joris

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