2015-01-02 3 views
3

pandas DataFrame을 와이드 형식에서 스택/레코드/데이터베이스/긴 형식으로 변환하는 가장 좋은 방법은 무엇입니까?pandas DataFrame을 스택/레코드/데이터베이스/긴 형식으로 재구성

와이드 포맷 :

date  hour1 hour2 hour3 hour4 
2012-12-31 9.18 -0.10 -7.00 -64.92 
2012-12-30 13.91 0.09 -0.96 0.08 
2012-12-29 12.97 11.82 11.65 10.20 
2012-12-28 22.01 16.04 15.68 11.67 
2012-12-27 11.44 0.07 -19.97 -67.98 
... 

스택/기록/데이터베이스/긴 형식 (필요) :

date     hour     price 
2012-12-31 00:00:00 hour1     9.18 
2012-12-31 00:00:00 hour2     -0.1 
2012-12-31 00:00:00 hour3      -7 
2012-12-31 00:00:00 hour4     -64.92 
... 
2012-12-30 00:00:00 hour1     7.18 
2012-12-30 00:00:00 hour2     -1.1 
2012-12-30 00:00:00 hour3      -9 
2012-12-30 00:00:00 hour4     -74.91 
... 

답변

7

당신은 변환 melt을 사용할 수 있습니다

여기에 작은 코드 예제 와이드 형식에서 긴 형식으로의 DataFrame :

import pandas as pd 
df = pd.DataFrame({'date': ['2012-12-31', '2012-12-30', '2012-12-29', '2012-12-28', '2012-12-27'], 
        'hour1': [9.18, 13.91, 12.97, 22.01, 11.44], 
        'hour2': [-0.1, 0.09, 11.82, 16.04, 0.07]}) 
print pd.melt(df, id_vars=['date'], value_vars=['hour1', 'hour2'], var_name='hour', value_name='price') 

출력 :

  date hour price 
0 2012-12-31 hour1 9.18 
1 2012-12-30 hour1 13.91 
2 2012-12-29 hour1 12.97 
3 2012-12-28 hour1 22.01 
4 2012-12-27 hour1 11.44 
5 2012-12-31 hour2 -0.10 
6 2012-12-30 hour2 0.09 
7 2012-12-29 hour2 11.82 
8 2012-12-28 hour2 16.04 
9 2012-12-27 hour2 0.07 
+0

매력처럼 작동합니다. :) Thanks !! –

2

당신은 DataFrame를 피벗 stack를 사용할 수 있습니다. 첫 번째 인덱스 컬럼으로 date을 설정 실제로 MultiIndex와 시리즈를 반환이

>>> df.set_index('date').stack() 
date    
2012-12-31 hour1  9.18 
      hour2  -0.10 
      hour3  -7.00 
      hour4 -64.92 
2012-12-30 hour1  13.91 
      hour2  0.09 
      hour3  -0.96 
      hour4  0.08 
... 

합니다. 지정한 것과 같은 DataFrame을 생성하려면 열을 스태킹하고 이름을 변경 한 후 MultiIndex를 재설정하면됩니다.

>>> stacked = df.set_index('date').stack() 
>>> df2 = stacked.reset_index() 
>>> df2.columns = ['date', 'hour', 'price'] 
>>> df2 
      date hour price 
0 2012-12-31 hour1 9.18 
1 2012-12-31 hour2 -0.10 
2 2012-12-31 hour3 -7.00 
3 2012-12-31 hour4 -64.92 
4 2012-12-30 hour1 13.91 
5 2012-12-30 hour2 0.09 
6 2012-12-30 hour3 -0.96 
7 2012-12-30 hour4 0.08 
... 
+0

나는 이미 stack() 함수를 사용하려고했지만 MultiIndex를 재설정하면 문제가 해결된다는 것을 모르고있었습니다. 둘 다 감사합니다 !! –

관련 문제