2014-12-02 2 views
3

Предположим, я пытался организовать данные о продажах для членства.Python Pandas: Как заполнять диапазоны дат в мультииндексе

У меня есть только даты начала и окончания. В идеале продажи между датой начала и окончания появляются как 1, а не пропадают.

Я не могу получить столбец «дата», который будет заполнен промежуточными датами. То есть: я хочу непрерывный набор месяцев вместо пробелов. Кроме того, мне нужно заполнить отсутствующие данные в столбцах с помощью ffill.

Я пробовал разные способы, такие как stack/unstack и reindex, но возникают разные ошибки. Я предполагаю, что есть чистый способ сделать это. Какая практика?

Пусть мультииндексированных структуры данных:

    variable  sales 
vendor date     
a  2014-01-01 start date 1 
     2014-03-01 end date 1 
b  2014-03-01 start date 1 
     2014-07-01 end date 1 

и желаемого результата

    variable sales 
vendor date     
a  2014-01-01 start date 1 
     2014-02-01 NaN  1 
     2014-03-01 end date 1 
b  2014-03-01 start date 1 
     2014-04-01 NaN  1 
     2014-05-01 NaN  1 
     2014-06-01 NaN  1 
     2014-07-01 end date 1 
+0

Почему метки R и matlab? Я снимаю их, если у вас есть причина пойти и вернуть их, но укажите причину! – Gregor

+0

Возможный дубликат [Заполнение пробелов в дате в мультииндексе Pandas Dataframe] (http://stackoverflow.com/questions/17287933/filling-in-date-gaps-in-multiindex-pandas-dataframe) –

+0

@KirubaharanJ Это решение не " t генерирует полный список дат. – LPG

ответ

4

вы можете do:

>>> f = lambda df: df.resample(rule='M', how='first') 
>>> df.reset_index(level=0).groupby('vendor').apply(f).drop('vendor', axis=1) 
        variable sales 
vendor date       
a  2014-01-31 start date  1 
     2014-02-28   NaN NaN 
     2014-03-31 end date  1 
b  2014-03-31 start date  1 
     2014-04-30   NaN NaN 
     2014-05-31   NaN NaN 
     2014-06-30   NaN NaN 
     2014-07-31 end date  1 

, а затем только .fillna по телефону sales при необходимости.

+0

Спасибо, это похоже на работу! Важный шаг здесь: groupby ('vendor'). Apply (f). Можете ли вы просто дать мне больше ясности относительно того, зачем нам здесь лямбда? Я не так опытен с Pandas ... – LPG

+0

@LPG 'groupby (...). Apply (f)' применяет данную функцию к каждой группе, см. [Здесь] (http://pandas.pydata.org/ pandas-docs/stable/groupby.html # flexible-apply) для получения дополнительных примеров –

0

У меня есть решение, но это не очень просто:

так, вот ваш DataFrame:

>>> df 
        sales date variable 
vendor date       
a  2014-01-01  1 start date 
     2014-01-03  1  end date 
b  2014-01-03  1 start date 
     2014-01-07  1  end date 

первый, я хочу, чтобы создать данные для нового MultiIndex:

>>> df2 = df.set_index('date variable', append=True).reset_index(level='date')['date'] 
>>> df2 
vendor date variable 
a   start date 2014-01-01 
      end date  2014-01-03 
b   start date 2014-01-03 
      end date  2014-01-07 
>>> df2 = df2.unstack() 
>>> df2 
date variable end date start date 
vendor        
a    2014-01-03 2014-01-01 
b    2014-01-07 2014-01-03 

сейчас, создать кортежи для нового MultiIndex:

>>> tuples = [(x[0], d) for x in df3.iterrows() for d in pd.date_range(x[1]['start date'], x[1]['end date'])] 
>>> tuples 
[('a', '2014-01-01'), ..., ('b', '2014-01-07)] 

и создать MultiIndex и reindex():

>>> mi = pd.MultiIndex.from_tuples(tuples,names=df.index.names) 
>>> df.reindex(mi) 
        sales date variable 
vendor date       
a  2014-01-01  1 start date 
     2014-01-02 NaN   NaN 
     2014-01-03  1  end date 
b  2014-01-03  1 start date 
     2014-01-04 NaN   NaN 
     2014-01-05 NaN   NaN 
     2014-01-06 NaN   NaN 
     2014-01-07  1  end date 
+0

Спасибо за это, вы получите результат, который я себе представлял. Вопрос, который я предвижу, заключается в том, что в реальном наборе данных в мультииндексе будет 5 уровней. Поэтому я надеялся, что можно использовать reindex() только в столбце даты. Есть идеи? – LPG

+0

@LPG не уверен, что возможно сбросить индекс на исходном DataFrame –

+0

Может быть, есть способ использовать развернутую/нераспакованную структуру? Имея даты как имена столбцов, 1 как значения и добавляете один столбец в месяц? – LPG

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