2013-12-05 2 views
5

У меня есть данные, как следует:заполнения отсутствуют индексы панд

import pandas as pd 
from datetime import datetime 

x = pd.Series([1, 2, 4], [datetime(2013,11,1), datetime(2013,11, 2), datetime(2013, 11, 4)]) 

недостающее индекс на 3 ноября соответствует нулевому значению, и я хочу, чтобы выглядеть следующим образом:

y = pd.Series([1,2,0,4], pd.date_range('2013-11-01', periods = 4)) 

Что лучший способ конвертировать x в y? Я попытался

y = pd.Series(x, pd.date_range('2013-11-1', periods = 4)).fillna(0) 

Это выдает ошибку индекса иногда, который я не могу интерпретировать (длина индекса не совпадают со значениями, хотя индекс и данные имеют одинаковую длину. Есть ли лучший способ сделать это?

ответ

8

Вы можете использовать pandas.Series.resample() для этого:.

>>> x.resample('D').fillna(0) 
2013-11-01 1 
2013-11-02 2 
2013-11-03 0 
2013-11-04 4 

Там в fill_method параметр в функции resample(), но я не знаю, если это возможно, чтобы использовать его для замены NaN при передискретизации но Похоже, что вы можете использовать how метод, чтобы заботиться о нем, как:

>>> x.resample('D', how=lambda x: x.mean() if len(x) > 0 else 0) 
2013-11-01 1 
2013-11-02 2 
2013-11-03 0 
2013-11-04 4 

Не знаю, какой метод является предпочтительным. Пожалуйста, также взгляните на ответ @ AndyHayden - возможно, reindex() с fill_value=0 был бы самым эффективным способом сделать это, но вам нужно сделать свои собственные тесты.

+0

+ 1 вы избили меня, ответьте на это на 11 секунд, мне пришлось добавить еще один вариант, я бы выбрал это, хотя. –

+0

спасибо за ответ :) – qua

+0

@AndyHayden спасибо, я действительно надеялся, что есть 'fill_method' для замены' NaN ' –

5

Я думаю, что я хотел бы использовать resample (примечание если есть обманутая она принимает среднее значение по умолчанию):

In [11]: x.resample('D') # you could use how='first' 
Out[11]: 
2013-11-01  1 
2013-11-02  2 
2013-11-03 NaN 
2013-11-04  4 
Freq: D, dtype: float64 

In [12]: x.resample('D').fillna(0) 
Out[12]: 
2013-11-01 1 
2013-11-02 2 
2013-11-03 0 
2013-11-04 4 
Freq: D, dtype: float64 

Если вы предпочитаемые простофилям, чтобы поднять, а затем использовать reindex:

In [13]: x.reindex(pd.date_range('2013-11-1', periods=4), fill_value=0) 
Out[13]: 
2013-11-01 1 
2013-11-02 2 
2013-11-03 0 
2013-11-04 4 
Freq: D, dtype: float64 
+0

благодарит за ответ! – qua

+1

+1 для вас. Трудно выбирать, когда есть так много способов сделать эту простую задачу :) –

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