2017-03-16 10 views
2

데이터 심오한 질문 : 어떻게 지나치게 넓은 DataFrame에서 특정 변수를 선택적으로 피벗시킬 수 있습니까?파이썬 팬더 : 와이드 폼 DataFrame의 특정 변수 피벗

df1 = pd.DataFrame(
    [[1,'a','b',.1,-1,10], 
    [2,'a','b',.2,-3,12], 
    [3,'c','d',.3,-5,14]], 
    columns=['sample','id1','id2','x','y1','y2']) 
print df1 
# sample id1 id2 x y1 y2 
#0  1 a b 0.1 -1 10 
#1  2 a b 0.2 -3 12 
#2  3 c d 0.3 -5 14 

으로 : X가 복사되었는지

# sample id position x y 
#0  1 a   1 0.1 -1 
#1  1 b   2 0.1 10 
#2  2 a   1 0.2 -3 
#3  2 b   2 0.2 12 
#4  3 c   1 0.3 -5 
#5  3 d   2 0.3 14 

주, 및 Y 위치와 정렬

예를 들어, I는 회전하고 싶다.

스트레이트 pd.melt()은 혼합 변수와 데이터 형식을 쉽게 선택 취소하여 와이드 형식으로 쉽게 되돌릴 수 없습니다.

print pd.melt(df1, id_vars='sample') 
# sample variable value 
#0  1  id1  a 
#1  2  id1  a 
#2  3  id1  c 
#3  1  id2  b 
#4  2  id2  b 
#5  3  id2  d 
#6  1  x 0.1 
#7  2  x 0.2 
#8  3  x 0.3 
#9  1  y1 -1 
#10  2  y1 -3 
#11  3  y1 -5 
#12  1  y2 10 
#13  2  y2 12 
#14  3  y2 14 

어떤 조언이 필요합니까? 감사!

답변

3

이 작업을 시도 할 수 있습니다 :

# set columns that don't change as index 
df1.set_index(['sample', 'x'], inplace=True) 

# create multi-index columns based on the names pattern 
df1.columns = pd.MultiIndex.from_arrays(df1.columns.str.extract(r"(\D+)(\d+)", expand=True).T.values) 

# transform the multi-index data frames to long format with stack 
df1.stack(level=1).rename_axis(('sample', 'x', 'position')).reset_index() 

enter image description here

+0

첫째을, 멋진 대답. df.columns.str.extract()가 나에게 처음부터 새롭게 추가 된 것입니다 : 컬럼 이름이 더 복잡하다면, 예를 들어 '['id1, f22 ','id2, f22 ','var50_a1 ','var50_a2 ']'. 올바른 var 이름/위치를 추출하기 위해 정규 표현식을 사용해야할까요? –

+0

정규식이 혼합 된 패턴 열을 쉽게 처리 할 수 ​​있다고 생각하지 않습니다. 예를 들어 'a1, a2, b1, b2, c1, c2' 또는 var1_a1, var1_a2와 같이 다중 인덱스로 분할하는 명확한 패턴이 있어야합니다. , var2_a1, var2_a2' 둘 다 괜찮을 것입니다. 후자이지만 혼합되지 않은 정규 표현식은'([^ _] +) _ ([^ _] +)'이어야합니다. 그러니 열 이름이 미치지 않게하는 것이 도움이 될 것입니다. – Psidom

+0

추출하기 전에 열의 이름을 바꿀만큼 쉽고 간단합니다. –