2017-03-13 2 views
2

이것은 StackOverflow의 첫 번째 질문입니다. 나는 당신이 문제를 도울 수 있기를 바랍니다. 그것은 저를 약간 괴롭 히고 있습니다. 나는 맞는 답을 찾을 수 없었다.범주 형 열의 범주 값 행 만들기

내 데이터는 다음과 같습니다

(인덱스 컬럼없이)으로 출력한다
df = pd.DataFrame({'col1': {0: 1, 1: 1, 2: 1}, 
       'col2': {0: 1, 1: 2, 2: 3}, 
       'col3': {0: 1, 1: 2, 2: 3}, 
       'col4': {0: 1.1, 1: 2.1, 2: 3.1}, 
       'col5': {0: 10, 1: 12, 2: 14}, 
       'col6': {0: 1.2, 1: 2.2, 2: 3.2}, 
       'col7': {0: 11, 1: 13, 2: 15}, 
       }) 
df.columns = ["VZ", "NZ", "L", "T_0_Rel", "T_0_Abs", "T_Akt_Rel", "T_Akt_Abs"] 
df 

:

╔════╦════╦═══╦═════════════╦═════╦═════╗ 
║ VZ ║ NZ ║ L ║ T_0/T_Akt ║ Abs ║ Rel ║ 
╠════╬════╬═══╬═════════════╬═════╬═════╣ 
║ 1 ║ 1 ║ 1 ║  T_0  ║ 10 ║ 1.1 ║ 
║ 1 ║ 1 ║ 1 ║  T_Akt ║ 11 ║ 1.2 ║ 
║ 1 ║ 2 ║ 2 ║  T_0  ║ 12 ║ 2.1 ║ 
║ 1 ║ 2 ║ 2 ║  T_Akt ║ 13 ║ 2.2 ║ 
║ 1 ║ 3 ║ 3 ║  T_0  ║ 14 ║ 3.1 ║ 
║ 1 ║ 3 ║ 3 ║  T_Akt ║ 15 ║ 3.2 ║ 
╚════╩════╩═══╩═════════════╩═════╩═════╝ 
:

╔════╦════╦═══╦═════════╦═════════╦═══════════╦═══════════╗ 
║ VZ ║ NZ ║ L ║ T_0_Rel ║ T_0_Abs ║ T_Akt_Rel ║ T_Akt_Abs ║ 
╠════╬════╬═══╬═════════╬═════════╬═══════════╬═══════════╣ 
║ 1 ║ 1 ║ 1 ║ 1.1 ║ 10 ║ 1.2 ║  11 ║ 
║ 1 ║ 1 ║ 2 ║ 2.1 ║ 12 ║ 2.2 ║  13 ║ 
║ 1 ║ 1 ║ 3 ║ 3.1 ║ 14 ║ 3.2 ║  15 ║ 
╚════╩════╩═══╩═════════╩═════════╩═══════════╩═══════════╝ 

가 지금은 이런 일에이 DataFrame 트위스트 할

기본적으로, T_O 및 T_Akt 값마다 행을 원하지만 Abs 및 Rel 값은 한 행에 머물러 있어야합니다.

나는이 .stack() 또는 .melt() 가능해야하는데,하지만 난 그것을 수행하는 방법을 알아낼 수있다.

이 모든 뒤에 내 의도는 seaborn.boxplot 또는 기능 .violinplot 색조 -argument을 사용하는 내 DataFrame의 범주 값을하는 것입니다. 범주 형 값 대신 여러 열을 사용하여 색상 인수를 사용하는 방법을 알아낼 수 없었습니다. (아마도 내가 틀렸고 훨씬 쉬운 방법이 있습니다 ...)

고마워요. 당신이 개념적으로 계층 열 인덱스를 가지고 있기 때문에

답변

4

것은, 나는 그런 식으로 만든 다음 stack

df = pandas.DataFrame({ 
    'VZ': {0: 1, 1: 1, 2: 1}, 
    'NZ': {0: 1, 1: 2, 2: 3}, 
    'L': {0: 1, 1: 2, 2: 3}, 
    'T_0_Rel': {0: 1.1, 1: 2.1, 2: 3.1}, 
    'T_0_Abs': {0: 10, 1: 12, 2: 14}, 
    'T_Akt_Rel': {0: 1.2, 1: 2.2, 2: 3.2}, 
    'T_Akt_Abs': {0: 11, 1: 13, 2: 15}, 
}) 

print(
    df.set_index(['VZ', 'NZ', 'L']) # row labels 
     .rename(columns=lambda c: tuple(c.rsplit('_', 1))) # create the multi-cols 
     .stack(level=0) # unpivot 
     .reset_index() # move the row labels back into normal columns 
) 

을 사용하여 내가 볼 것입니다 :

VZ NZ L level_3 Abs Rel 
0 1 1 1  T_0 10 1.1 
1 1 1 1 T_Akt 11 1.2 
2 1 2 2  T_0 12 2.1 
3 1 2 2 T_Akt 13 2.2 
4 1 3 3  T_0 14 3.1 
5 1 3 3 T_Akt 15 3.2