2013-07-16 4 views
3

Еще один вопрос новичков-панд. Я хочу преобразовать DataFrame в словарь, но в отличие от того, что предлагается функцией DataFrame.to_dict(). Объяснение на примере:Pandas: Преобразование DataFrame с MultiIndex в dict

df = pd.DataFrame({'co':['DE','DE','FR','FR'], 
        'tp':['Lake','Forest','Lake','Forest'], 
        'area':[10,20,30,40], 
        'count':[7,5,2,3]}) 
df = df.set_index(['co','tp']) 

Перед:

  area count 
co tp 
DE Lake  10  7 
    Forest 20  5 
FR Lake  30  2 
    Forest 40  3 

После того, как:

{('DE', 'Lake', 'area'): 10, 
('DE', 'Lake', 'count'): 7, 
('DE', 'Forest', 'area'): 20, 
... 
('FR', 'Forest', 'count'): 3 } 

Ключи Dict должны быть кортежи, состоящие из заголовка индекс строки + колонке, в то время как значения Dict должно быть отдельные значения DataFrame. Для приведенного выше примера, мне удалось найти это выражение:

after = {(r[0],r[1],c):df.ix[r,c] for c in df.columns for r in df.index} 

Как обобщать этот код, чтобы работать с мультииндексами N уровнями (вместо 2)?

Ответ

Благодаря DSM's answer, я обнаружил, что я на самом деле просто нужно использовать кортеж конкатенацию r+(c,) и мой 2-мерный цикл выше становится N-мерную:

after = {r + (c,): df.ix[r,c] for c in df.columns for r in df.index} 

ответ

7

Как насчет:

>>> df 
      area count 
co tp     
DE Lake  10  7 
    Forest 20  5 
FR Lake  30  2 
    Forest 40  3 
>>> after = {r + (k,): v for r, kv in df.iterrows() for k,v in kv.to_dict().items()} 
>>> import pprint 
>>> pprint.pprint(after) 
{('DE', 'Forest', 'area'): 20, 
('DE', 'Forest', 'count'): 5, 
('DE', 'Lake', 'area'): 10, 
('DE', 'Lake', 'count'): 7, 
('FR', 'Forest', 'area'): 40, 
('FR', 'Forest', 'count'): 3, 
('FR', 'Lake', 'area'): 30, 
('FR', 'Lake', 'count'): 2} 
+0

Спасибо, 'r + (k,)' -idea отсутствует. С его помощью я могу даже использовать мой оригинальный цикл индексов/столбцов, который выглядит более легко читаемым. – ojdo

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