Pandas Multiindex from array => TypeError: unhashable тип: 'dict'



Я пытаюсь создать фрейм данных из массива со следующей структурой:



df = [[{'date_time': Timestamp('2015-05-22 05:37:59'),
'name': 'Tom',
'value': '129'},
{'date_time': Timestamp('2015-05-22 05:37:59'),
'name': 'Kate',
'value': '0'},
{'date_time': Timestamp('2015-05-22 05:37:59'),
'name': 'GroupeId',
'value': '0'}, {...}, {...}, {...}],[another list of dictionaries like the first one],[and another one]]


Используя этот код:



def create_from_arr():
baby_array=pd.MultiIndex.from_tuples(df, names=['sessions', 'behaves'])
return baby_array


У меня есть следующая ошибка, которую я не мог понять:



TypeError: unhashable type: 'dict'


Мой желаемый результат выглядит так:



list 
date_time name value
1 0 2015-05-22 05:37:59 Tom 129
1 2015-05-22 05:37:59 Kate 0
2 2015-05-22 05:37:59 GroupeId 0
2 3 2015-05-26 05:56:59 Hence 129
4 2015-05-26 05:56:59 Kate 0
5 2015-05-26 05:56:59 Julie 0
3 ...................... ...... ......
664   2  

2 ответов:

Я все еще не уверен, что именно вы хотите сделать с Мультииндексом, но вот один из способов "сгладить" ваш словарь в многоуровневых массивах и правильно загрузить данные в фрейм данных:

Обновлено с помощью "list" и "index" как MultiIndex

In [100]: data = [[{'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'Tom',
   .....:         'value': '129'},
   .....:        {'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'Kate',
   .....:         'value': '0'},
   .....:        {'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'GroupeId',
   .....:         'value': '0'}], [{'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'Tom',
   .....:         'value': '129'},
   .....:        {'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'Kate',
   .....:         'value': '0'},
   .....:        {'date_time': Timestamp('2015-05-22 05:37:59'),
   .....:         'name': 'GroupeId',
   .....:         'value': '0'}]]

In [101]: df = pd.DataFrame(columns=['list', 'date_time', 'name', 'value'])

In [102]: for idx, each in enumerate(data, 1):
   .....:     temp = pd.DataFrame(each)
   .....:     temp['list'] = idx  # manually assign "list" index
   .....:     df = df.append(temp, ignore_index=True)
   .....:     
In [103]: df = df.reset_index()

In [104]: df.set_index(['list', 'index'])
Out[104]: 
                     date_time      name value
list index                                    
1    0     2015-05-22 05:37:59       Tom   129
     1     2015-05-22 05:37:59      Kate     0
     2     2015-05-22 05:37:59  GroupeId     0
2    3     2015-05-22 05:37:59       Tom   129
     4     2015-05-22 05:37:59      Kate     0
     5     2015-05-22 05:37:59  GroupeId     0

IIUC, пусть d - это выписка из вашего массива:

d = [[{'date_time': '2015-05-22 05:37:59',
   'name': 'Tom',
   'value': '129'},
  {'date_time': '2015-05-22 05:37:59',
   'name': 'Kate',
   'value': '0'}]]

Я бы извлек фрейм данных с помощью:

df = pd.DataFrame.from_dict(d[0])

Который возвращает:

             date_time  name value
0  2015-05-22 05:37:59   Tom   129
1  2015-05-22 05:37:59  Kate     0
Надеюсь, это поможет.

Comments

    Ничего не найдено.