2014-09-15 4 views
4

데이터 프레임을 변형하려고하지만 필요한 결과를 얻을 수 없습니다. dataframe은 다음과 같습니다여러 열을 전 환 팬더 데이터 프레임

m r s p O  W  N  p O  W  N  p O  W  N 
    1 4 3 1 2.81 3.70 3.03 2 0.58 0.78 0.60 3 1.98 1.34 1.81 
    1 4 4 1 2.14 2.82 2.31 2 0.67 0.00 0.00 3 0.00 0.04 0.15 
    1 4 5 1 1.47 1.94 1.59 2 1.03 2.45 1.68 3 0.01 0.00 0.26 

나는 pivot_table 기능

df.pivot_table(index=['m','r','s'], columns=['p'], values=['O','W','N']) 

을 사용하려고하지만 I :

m r s p O  W  N   
    1 4 3 1 2.81 3.70 3.03 
    1 4 4 1 2.14 2.82 2.31 
    1 4 5 1 1.47 1.94 1.59 
    1 4 3 2 0.58 0.78 0.60 
    1 4 4 2 0.67 0.00 0.00 
    1 4 5 2 1.03 2.45 1.68 
    1 4 3 3 1.98 1.34 1.81 
    1 4 4 3 0.00 0.04 0.15 
    1 4 5 3 0.01 0.00 0.26 

내가이 같이 표시됩니다 있도록 dataframe을 바꿀 필요 내가 원하는 것을 얻을 수 없다. 누구든지이 작업을 수행하는 방법을 알고 있습니까?

답변

5

자신이 팬더로 꽤 유용하다고 생각하는 사람은 pivot_tablemelt 기능이 저를 혼란스럽게합니다. 잘 정의되고 고유 한 인덱스를 사용하고 데이터 프레임 자체의 stackunstack 메서드를 사용하는 것이 좋습니다.

먼저 p- 열을 반복해야하는지 물어 봅니다. 나는 데이터를 제시 할 때 그 가치를 일종의 것으로 볼 수는 있지만, IMO 판다는 그런 식으로 일할 준비가되어 있지 않습니다. 우리는 그것을 구속 할 수 있지만 더 간단한 해결책이 필요한 것을 얻을 수 있는지 알아 봅시다. 여기

내가 할 것이 무엇 :

from io import StringIO 
import pandas 

datatable = StringIO("""\ 
    m r s p O  W  N   
    1 4 3 1 2.81 3.70 3.03 
    1 4 4 1 2.14 2.82 2.31 
    1 4 5 1 1.47 1.94 1.59 
    1 4 3 2 0.58 0.78 0.60 
    1 4 4 2 0.67 0.00 0.00 
    1 4 5 2 1.03 2.45 1.68 
    1 4 3 3 1.98 1.34 1.81 
    1 4 4 3 0.00 0.04 0.15 
    1 4 5 3 0.01 0.00 0.26""") 

df = (
    pandas.read_table(datatable, sep='\s+') 
      .set_index(['m', 'r', 's', 'p']) 
      .unstack(level='p') 
) 

df.columns = df.columns.swaplevel(0, 1) 
df.sort(axis=1, inplace=True) 

print(df) 

인쇄 어느 : 모든 값, 예를 들어, 그래서

p   1     2     3    
      O  W  N  O  W  N  O  W  N 
m r s              
1 4 3 2.81 3.70 3.03 0.58 0.78 0.60 1.98 1.34 1.81 
    4 2.14 2.82 2.31 0.67 0.00 0.00 0.00 0.04 0.15 
    5 1.47 1.94 1.59 1.03 2.45 1.68 0.01 0.00 0.26 

이제 열이 MultiIndex는 당신이 액세스 할 수 df[2]을 가진 곳 p = 2 또는 df.xs(2, level='p', axis=1), 나를 제공합니다 :

  O  W  N 
m r s     
1 4 3 0.58 0.78 0.60 
    4 0.67 0.00 0.00 
    5 1.03 2.45 1.68 

마찬가지로와 W 모든 열을 얻을 수 있습니다 : df.xs('W', level=1, axis=1) (우리가 level=1 말) 그 열 수준에 이름이 없기 때문에, 그래서 우리는 당신이 유사 열을 조회 할 수 있습니다 대신 위치)

p   1  2  3 
m r s     
1 4 3 3.70 0.78 1.34 
    4 2.82 0.00 0.04 
    5 1.94 2.45 0.00 

를 사용 axis=0을 사용합니다. 당신이 정말로이 열에서 p 값을 필요 경우

, 당신의 열을 수동으로 거기를 추가하고 인덱싱 :

for p in df.columns.get_level_values('p').unique(): 
    df[p, 'p'] = p 

cols = pandas.MultiIndex.from_product([[1,2,3], list('pOWN')]) 
df = df.reindex(columns=cols) 
print(df) 

     1     2     3     
     p  O  W  N p  O  W  N p  O  W  N 
m r s                
1 4 3 1 2.81 3.70 3.03 2 0.58 0.78 0.60 3 1.98 1.34 1.81 
    4 1 2.14 2.82 2.31 2 0.67 0.00 0.00 3 0.00 0.04 0.15 
    5 1 1.47 1.94 1.59 2 1.03 2.45 1.68 3 0.01 0.00 0.26 
+0

을 나는 그러나이 작은 스크립트의 마지막 단계, 당신이 무슨 짓을했는지 참조 내가 쓴, 나는 내가 언급 한 것처럼 보이는 출력물이 필요하다. pandas가이 작업을 수행하는 도구가 아닌 경우 원하는 출력을 얻기 위해 데이터 프레임을 조작하는 데 어떤 방법을 사용 하시겠습니까? –

+0

@Daniel 편집 내역을 참조하십시오. –

+0

위 방식이 효과적입니다. 어떻게 작동하는지 더 잘 이해하기 위해 사용했던 모든 기능에 대해 자세히 살펴볼 것입니다. –

관련 문제