2017-01-20 4 views
1

HEJ,재편/변형시키는 pandas.Dataframe이

그래서, 다음 pandas.DataFrame

df = pandas.DataFrame({ 
    "date": ["2016-12-11", "2016-12-12", "2016-12-13", "2016-12-14", "2016-12-15"], 
    "dim1": ["dim11", "dim12", "dim12", "dim11", "dim13"], 
    "dim2": ["dim22", "dim21", "dim21", "dim22", "dim23"], 
    "dim3": ["dim31", "dim32", "dim32", "dim31", "dim33"], 
    "val1": [1, 2, 3, 4, 5], 
    "val2": [6, 7, 8, 9, 10], 
    "val3": [11,12,13,14,15] 
    }) 

내가 지금 원하는 것은 여러 "차원"다중 "값"을 지정하는 것입니다있어 지정된 크기와 값이 서로 "결합"되도록 DataFrame 이 변형/변형됩니다. 지정되지 않은 값은 사라질 수 있지만 지정된 차원은 결과로 나오는 DataFrame에 남아 있어야합니다.

결과로 나오는 DataFrame의 간단한 예를 명확하게 만듭니다. 지정 기준은 : DIM1, DIM2 규격 값 : VAL1, val2만큼

df_res = pandas.DataFrame({ 
    "date": ["2016-12-11", "2016-12-12", "2016-12-13", "2016-12-14", "2016-12-15"], 
    "dim3": ["dim31", "dim32", "dim32", "dim31", "dim33"], 
    "dim11_dim22_val1": [1, 0, 0, 4, 0], 
    "dim12_dim21_val1": [0, 2, 3, 0, 0], 
    "dim13_dim23_val1": [0, 0, 0, 0, 5], 
    "dim11_dim22_val2": [6, 0, 0, 9, 0], 
    "dim12_dim21_val2": [0, 7, 8, 0, 0], 
    "dim13_dim23_val2": [0, 0, 0, 0, 10] 
}) 

그래서 기본적 DIM1, DIM2, VAL1과 val2만큼 여러 조합이있다. 결과에서 val3이 떨어지지 만 date_id 및 dim3 차원은 그대로 있습니다. 보조 노트로

: 그 후 나는 출력

[ 
    {"date_id": "2016-12-11", "dim3": "dim31", "dim11_dim22_val1": 1, "dim12_dim21_val1": 0, "dim13_dim23_val1": 0, "dim11_dim22_val2": 6, "dim12_dim21_val2": 0, "dim13_dim23_val2": 0} 
    ... 
] 

좀 팬더의 마법이 작업을 수행 할 수해야 df_res.to_dict (동양 = "기록") 할 것인가? df.pivot의 여러 단계 일 수 있습니까?

종류는 데니스

+0

두 가지 질문이 너무 많습니다. – IanS

답변

1

부에 관하여 1 :

1) 당신은 등 전체 작업 중 정적 남아있을 것입니다 날짜와 함께 희미한로 시작하는 열을 설정할 수 있습니다 색인 축. 중복 된 인덱스에 대면하기 위해 append=True을 제공하십시오.

2) unstack 필요한 수준. 원하지 않는 val3 열을 버리고 누락 된 값을 0으로 채 웁니다.

3) 다중 색인 튜플을 밑줄로 결합하여 열의 이름을 바꿉니다.

4) 스택되지 않은 것과 동일한 레벨을 재설정하고 필요한 출력과 일치하도록 열 이름을 추가로 정렬합니다.


df.set_index(df.filter(like='dim').columns.tolist()+['date'], append=True, inplace=True) 
df = df.unstack(level=[2,1]).drop('val3', axis=1).fillna(0).astype(int) 
df.columns = ['_'.join(c[::-1]) for c in df.columns] 
df_res = df.reset_index(level=[2,1]).sort_index(axis=1) 
df_res 

enter image description here


2 부 :

df_res.to_dict('r') 

는 생산 :

[{'date': '2016-12-11', 
    'dim11_dim22_val1': 1, 
    'dim11_dim22_val2': 6, 
    'dim12_dim21_val1': 0, 
    'dim12_dim21_val2': 0, 
    'dim13_dim23_val1': 0, 
    'dim13_dim23_val2': 0, 
    'dim3': 'dim31'}, .......... 
+1

그게 많은 도움이되었습니다. 고맙습니다! – Dennis