2015-08-27 2 views
1

У меня есть список словарей следующим образом:Проблемы с Пандой передискретизации

>>>L=[ 
    { 
    "timeline": "2014-10", 
    "total_prescriptions": 17 
    }, 
    { 
    "timeline": "2014-11", 
    "total_prescriptions": 14 
    }, 
    { 
    "timeline": "2014-12", 
    "total_prescriptions": 8 
    }, 
    { 
    "timeline": "2015-1", 
    "total_prescriptions": 4 
    }, 
    { 
    "timeline": "2015-3", 
    "total_prescriptions": 10 
    }, 
    { 
    "timeline": "2015-4", 
    "total_prescriptions": 3 
    } 
    ] 

Что мне нужно сделать, это заполнить отсутствующие месяцы, в этом случае фев 2015 с общим рецептом, как zero.I используется панды для него следующим образом:

>>> df = pd.DataFrame(L) 
>>> df.index=pd.to_datetime(df.timeline,format='%Y-%m') 
>>> df 
      timeline total_prescriptions 
timeline 
2014-10-01 2014-10     17 
2014-11-01 2014-11     14 
2014-12-01 2014-12     8 
2015-01-01 2015-1     4 
2015-03-01 2015-3     10 
2015-04-01 2015-4     3 

>>> df = df.resample('MS').fillna(0) 
>>> df 
      total_prescriptions 
timeline 
2014-10-01     17 
2014-11-01     14 
2014-12-01     8 
2015-01-01     4 
2015-02-01     0 
2015-03-01     10 
2015-04-01     3 

до сих пор так good..Just, что я want..Now мне нужно преобразовать этот кадр данных обратно в список dicts..This, как я это делаю:

>>> response = df.T.to_dict().values() 
>>> response 
[{'total_prescriptions': 0.0}, 
{'total_prescriptions': 17.0},  
{'total_prescriptions': 10.0}, 
{'total_prescriptions': 14.0}, 
{'total_prescriptions': 4.0}, 
{'total_prescriptions': 8.0}, 
{'total_prescriptions': 3.0}] 

Упорядочение потеряно, временная шкала отсутствует, а total_prescriptions становится десятичным значением из int.What происходит неправильно?

+0

Ну * десятичное значение, потому что ваш DTYPE будет преобразован плавать из-за 'NaN' строк, введенной передискретизацией, вы можете преобразовать обратно с помощью этого:' ДФ = df.resample («MS») .fillna (0) .astype (np.int32) ', поскольку потеря упорядоченности происходит из-за того, что dict не гарантирует порядок при вызове' values', вам придется сортировать ключи и строить dict из отсортированного ключи – EdChum

ответ

1

Во-первых, переход к десятичного действительно float DTYPE благодаря передискретизации, как это будет ввести NaN значения для отсутствующих значений, вы можете исправить это с помощью astype, вы можете восстановить свой столбец «временной шкалы», который затерялся в ней не могу понять, как ресэмплировать str поэтому мы можем применить strftime к индексу:

In [80]: 
df = df.resample('MS').fillna(0).astype(np.int32) 
df['timeline'] = df.index.to_series().apply(lambda x: dt.datetime.strftime(x, '%Y-%m')) 
df 

Out[80]: 
      total_prescriptions timeline 
timeline         
2014-10-01     17 2014-10 
2014-11-01     14 2014-11 
2014-12-01     8 2014-12 
2015-01-01     4 2015-01 
2015-02-01     0 2015-02 
2015-03-01     10 2015-03 
2015-04-01     3 2015-04 

Теперь нам нужно отсортировать ключи Dict как вызов values будет потерян отсортированный порядок, и мы можем выполнить список понимание в вернитесь к оригинальной форме:

In [84]: 
d = df.T.to_dict() 
[d[key[0]] for key in sorted(d.items())] 

Out[84]: 
[{'timeline': '2014-10', 'total_prescriptions': 17}, 
{'timeline': '2014-11', 'total_prescriptions': 14}, 
{'timeline': '2014-12', 'total_prescriptions': 8}, 
{'timeline': '2015-01', 'total_prescriptions': 4}, 
{'timeline': '2015-02', 'total_prescriptions': 0}, 
{'timeline': '2015-03', 'total_prescriptions': 10}, 
{'timeline': '2015-04', 'total_prescriptions': 3}] 
+0

@ Edchum..это помогает ... все же ... значение временной шкалы все еще отсутствует .. Цель состоит в том, чтобы иметь структуру данных, такую ​​как исходный вход. – Amistad

+0

perfect..take несколько баллов !! – Amistad

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