2016-11-16 2 views
2

나는이 형식의 사전 "my_dict"이 : 현재중첩 된 사전을 pandas 데이터 프레임으로 변환하는 방법은 무엇입니까?

{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}}, 
'l2':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}} 
} 

을, 나는 pd.DataFrame.from_dict(my_dict, orient='index')를 사용하여이 같은 DF 수 있어요 :

       c2       c1 
l1 {u'a': 3, u'c': 5, u'b': 4} {u'a': 0, u'c': 2, u'b': 1} 
l2 {u'a': 3, u'c': 5, u'b': 4} {u'a': 0, u'c': 2, u'b': 1} 

그러나, 내가 원하는 것은 모두 L1/L2를 c2/c3을 인덱스로 사용하고 a/b/c를 컬럼으로 사용합니다. 이 같은
뭔가 :

 a b c 
l1 c1 0 1 2 
    c2 3 4 5 
l2 c1 0 1 2 
    c2 3 4 5 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

+0

이 복제본은 무엇입니까? http://stackoverflow.com/questions/13575090/construct-pandas-dataframe-from-items-in-nested-dictionary – JohnE

+0

@ JohnE 고맙습니다! 나는 그것을 조사 할 것이다. –

+0

@ JohnE, 정확한 복제본이 아니기 때문에 나는 그 중 하나를 시도했지만 매우 가까이에 있지만 컬럼은 여전히 ​​정렬이 필요하지만 훌륭한 제안입니다! – davedwards

답변

3

튜플 키를 사용하여 사전을 작성하는 사전 이해를 고려하십시오. 그런 다음 팬더 'MultiIndex.from_tuples을 사용하십시오. 아래 ast은 문자열에서 원본 사전을 다시 작성하는 데 사용됩니다 (마지막 단계는 무시하십시오).

import pandas as pd 
import ast 

origDict = ast.literal_eval(""" 
{'l1':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}}, 
'l2':{'c1': {'a': 0, 'b': 1, 'c': 2}, 
     'c2': {'a': 3, 'b': 4, 'c': 5}} 
}""") 

# DICTIONARY COMPREHENSION 
newdict = {(k1, k2):v2 for k1,v1 in origDict.items() \ 
         for k2,v2 in origDict[k1].items()} 
print(newdict) 
# {('l1', 'c2'): {'c': 5, 'a': 3, 'b': 4}, 
# ('l2', 'c1'): {'c': 2, 'a': 0, 'b': 1}, 
# ('l1', 'c1'): {'c': 2, 'a': 0, 'b': 1}, 
# ('l2', 'c2'): {'c': 5, 'a': 3, 'b': 4}} 

# DATA FRAME ASSIGNMENT 
df = pd.DataFrame([newdict[i] for i in sorted(newdict)], 
        index=pd.MultiIndex.from_tuples([i for i in sorted(newdict.keys())]))  
print(df) 
#  a b c 
# l1 c1 0 1 2 
# c2 3 4 5 
# l2 c1 0 1 2 
# c2 3 4 5 
+0

환상적! @ Parfait에게 감사합니다! 왜 그냥 ast.literal_eval을 사용했는지 궁금한가요? –

+1

좋습니다! 'ast.literal_eval'을 사용하면 사용자의 dict을 재정의하지 않고 게시 한 것처럼 문자열에서 직접 작성할 필요가 없습니다. – Parfait

관련 문제