2012-11-26 15 views
35

한다고 가정 나는 구조의 중첩 된 사전 'user_dict'이 있습니다구조의 팬더 DataFrame

레벨 1 : 사용자 아이디 (정수 (Long))

레벨 2 : 범주 (문자열)

레벨 3 : 모듬 특성 (수레의 int, 등등)

, 이 사전의 항목은 다음과 같습니다

user_dict[12] = { 
    "Category 1": {"att_1": 1, 
        "att_2": "whatever"}, 
    "Category 2": {"att_1": 23, 
        "att_2": "another"}} 

"user_dict"의 각 항목은 동일한 구조를 가지고 "user_dict"는에서 시리즈를 구성, 나는 팬더 DataFrame에 먹이고 싶은 많은 수의 항목을 포함 속성. 이 경우 계층 적 색인이이 목적에 유용합니다.

특히, 내 질문은 DataFrame 생성자가 시리즈를 사전의 "레벨 3"값으로 작성해야한다는 것을 이해하는 데 도움이되는 방법이 있는지 여부입니다. 나는 인덱스로 사용자 ID의이 (달성하고자하는 것과 반대 인, 열로 촬영 (사용자 ID의) "수준 1"에

df = pandas.DataFrame(users_summary) 

항목 :

내가 좋아하는 뭔가를 시도하는 경우).

제가 사전 항목을 반복하여 시리즈를 구성 할 수 있다는 것을 알고 있지만, 직접적인 방법이 있다면 매우 유용 할 것입니다. 비슷한 질문은 파일에 나열된 json 객체에서 pandas DataFrame을 구성 할 수 있는지 여부를 묻는 것입니다.

답변

51

팬더 MultiIndex는 튜플 목록으로 구성됩니다. 그래서 가장 자연스러운 접근법은 여러분의 입력 딕셔너리를 재 형성하여 키가 필요한 다중 인덱스 값에 해당하는 튜플이되도록하는 것입니다. 그럼 그냥 옵션 orient='index'을 사용하여, pd.DataFrame.from_dict를 사용하여 dataframe을 구성 할 수 있습니다

user_dict = {12: {'Category 1': {'att_1': 1, 'att_2': 'whatever'}, 
        'Category 2': {'att_1': 23, 'att_2': 'another'}}, 
      15: {'Category 1': {'att_1': 10, 'att_2': 'foo'}, 
        'Category 2': {'att_1': 30, 'att_2': 'bar'}}} 

pd.DataFrame.from_dict({(i,j): user_dict[i][j] 
          for i in user_dict.keys() 
          for j in user_dict[i].keys()}, 
         orient='index') 


       att_1  att_2 
12 Category 1  1 whatever 
    Category 2  23 another 
15 Category 1  10  foo 
    Category 2  30  bar 

다른 방법은 구성 요소 dataframes 연결하여 귀하의 dataframe을 구축하는 것입니다 : 그래서 내가 사용하는 데 사용

user_ids = [] 
frames = [] 

for user_id, d in user_dict.iteritems(): 
    user_ids.append(user_id) 
    frames.append(pd.DataFrame.from_dict(d, orient='index')) 

pd.concat(frames, keys=user_ids) 

       att_1  att_2 
12 Category 1  1 whatever 
    Category 2  23 another 
15 Category 1  10  foo 
    Category 2  30  bar 
+1

임의의 깊이있는 불규칙한 목록으로 작동하도록 일반화하는 합리적인 방법이 있습니까? 예 : 어떤 가지가 다른 것보다 짧을 수있는 임의의 깊이에 나열하고, 짧은 가지가 끝까지 도달하지 않을 때 없음 또는 나노가 사용됩니까? – naught101

+3

pandas json support (io 도구) 및 정규화를 살펴 보셨습니까? http://pandas.pydata.org/pandas-docs/dev/io.html#normalization –

+0

내 인생을 살리십시오 !!!!!!!!!! 많이 배우십시오! 고마워요 – Wen

10

을 사전을 반복하는 for 루프도 있지만 훨씬 빠르게 작동하는 것으로 밝혀진 것은 패널로 변환 한 다음 데이터 프레임으로 변환하는 것입니다. 당신이 사전 D

import pandas as pd 
d 
{'RAY Index': {datetime.date(2014, 11, 3): {'PX_LAST': 1199.46, 
'PX_OPEN': 1200.14}, 
datetime.date(2014, 11, 4): {'PX_LAST': 1195.323, 'PX_OPEN': 1197.69}, 
datetime.date(2014, 11, 5): {'PX_LAST': 1200.936, 'PX_OPEN': 1195.32}, 
datetime.date(2014, 11, 6): {'PX_LAST': 1206.061, 'PX_OPEN': 1200.62}}, 
'SPX Index': {datetime.date(2014, 11, 3): {'PX_LAST': 2017.81, 
'PX_OPEN': 2018.21}, 
datetime.date(2014, 11, 4): {'PX_LAST': 2012.1, 'PX_OPEN': 2015.81}, 
datetime.date(2014, 11, 5): {'PX_LAST': 2023.57, 'PX_OPEN': 2015.29}, 
datetime.date(2014, 11, 6): {'PX_LAST': 2031.21, 'PX_OPEN': 2023.33}}} 

명령을 말해봐

pd.Panel(d) 
<class 'pandas.core.panel.Panel'> 
Dimensions: 2 (items) x 2 (major_axis) x 4 (minor_axis) 
Items axis: RAY Index to SPX Index 
Major_axis axis: PX_LAST to PX_OPEN 
Minor_axis axis: 2014-11-03 to 2014-11-06 
pd.Panel (D) [항목] 그런 다음 명령 to_frame을 칠 수

pd.Panel(d)['SPX Index'] 
2014-11-03 2014-11-04 2014-11-05 2014-11-06 
PX_LAST 2017.81 2012.10 2023.57 2031.21 
PX_OPEN 2018.21 2015.81 2015.29 2023.33 

dataframe를 산출

()를 눌러 데이터 프레임으로 만듭니다. 주 및 보조 축을 인덱스로 사용하는 대신 열로 변환하는데도 reset_index를 사용합니다.당신이) (프레임 당신이 to_frame를 호출하기 전에 모양을 변경할 패널의 전치 기능을 사용할 수 있습니다 보이는 방법을 원치 않을 경우

pd.Panel(d).to_frame().reset_index() 
major minor  RAY Index SPX Index 
PX_LAST 2014-11-03 1199.460 2017.81 
PX_LAST 2014-11-04 1195.323 2012.10 
PX_LAST 2014-11-05 1200.936 2023.57 
PX_LAST 2014-11-06 1206.061 2031.21 
PX_OPEN 2014-11-03 1200.140 2018.21 
PX_OPEN 2014-11-04 1197.690 2015.81 
PX_OPEN 2014-11-05 1195.320 2015.29 
PX_OPEN 2014-11-06 1200.620 2023.33 

마지막으로, 그냥 예를 들어 여기에 문서 http://pandas.pydata.org/pandas-docs/dev/generated/pandas.Panel.transpose.html

참조

pd.Panel(d).transpose(2,0,1).to_frame().reset_index() 
major  minor 2014-11-03 2014-11-04 2014-11-05 2014-11-06 
RAY Index PX_LAST 1199.46 1195.323  1200.936 1206.061 
RAY Index PX_OPEN 1200.14 1197.690  1195.320 1200.620 
SPX Index PX_LAST 2017.81 2012.100  2023.570 2031.210 
SPX Index PX_OPEN 2018.21 2015.810  2015.290 2023.330 

희망이 있습니다.

+0

그런 우아한 해결책! – vk1011

+0

이것은 이해하기가 더 쉬웠습니다. 고맙습니다. – Moondra