2017-04-09 4 views
1

나는 '이름'열로 그룹화 된 관측 목록 인 dataFrame을 가지고 있습니다. 나는 그것을 다중 인덱스 형식으로 바꾸는 데 어려움을 겪고 있습니다. 그래서clustermap에 대해 Pandas DataFrame을 MultiIndexed 형식으로 변환하는 방법은 무엇입니까?

name | ratio | DayOfWeek | HourOfDay 
    foo | 0.7 | Mon  | 0 
    foo | 0.2 | Mon  | 1 
    foo | 0.11 | Mon  | 2 
    foo | 0.45 | Mon  | 3 
.. 
    foo | 0.2 | Mon  | 23 
    foo | 0.1 | Tue  | 0 
    foo | 0.6 | Tue  | 1 
    foo | 0.2 | Tue  | 2 
.. 
    foo | 0.1 | Sun  | 23 
    bar | 0.2 | Mon  | 0 
    bar | 0.11 | Mon  | 1 
.. 

과 :

내가 좋아하는 뭔가가있다.

내가 원하는 것은 seaborn clustermaps에 사용할 수있는 것으로, 매일 (전체적으로) 이름 별 '비율'과 일 내의 특정 시간 사이의 상관 관계를 나타냅니다.

내가 좋아하는 뭔가가 필요 (올바른 경우 확실하지,하지만 그게 내가 뭘하려입니다) :

     | foo | bar | ... 
DayOfWeek HourOfDay | 
Mon  0   | 0.7 | 0.2 | ... 
      1   | ... 
      2   | ... 
... 
Tue  0   | 0.1 | ... 
      1   | ... 
...  2 

내가 XS 수 있기를 희망 일단()을 시본에서 히트 맵/clustermap이 사용할 수 조각으로.

답변

1

당신은 unstack으로 set_index를 사용할 수 있습니다

print (df) 
    name ratio DayOfWeek HourOfDay 
0 foo 0.70  Mon   0 <- duplicate for same name, DayOfWeek and HourOfDay - 0.7 
1 foo 0.90  Mon   0 <- duplicate for same name, DayOfWeek and HourOfDay - 0.9 
2 foo 0.20  Mon   1 
3 foo 0.11  Mon   2 
4 foo 0.45  Mon   3 
5 foo 0.20  Mon   23 
6 foo 0.10  Tue   0 
7 foo 0.60  Tue   1 
8 foo 0.20  Tue   2 
9 foo 0.10  Sun   23 
10 bar 0.20  Mon   0 
11 bar 0.11  Mon   1 


df = df.pivot_table(index=['DayOfWeek','HourOfDay'], 
        columns='name', 
        values='ratio', 
        aggfunc='mean') 
print (df) 

name     bar foo 
DayOfWeek HourOfDay    
Mon  0   0.20 0.80 < (0.7 + 0.9)/2 = 0.8 
      1   0.11 0.20 
      2   NaN 0.11 
      3   NaN 0.45 
      23   NaN 0.20 
Sun  23   NaN 0.10 
Tue  0   NaN 0.10 
      1   NaN 0.60 
      2   NaN 0.20 

대체 groupby과 :

df = df.groupby(['DayOfWeek','HourOfDay','name'])['ratio'].mean().unstack() 
print (df) 
name     bar foo 
DayOfWeek HourOfDay    
Mon  0   0.20 0.80 < (0.7 + 0.9)/2 = 0.8 
      1   0.11 0.20 
      2   NaN 0.11 
      3   NaN 0.45 
      23   NaN 0.20 
Sun  23   NaN 0.10 
Tue  0   NaN 0.10 
      1   NaN 0.60 
      2   NaN 0.20 

df = df.set_index(['DayOfWeek','HourOfDay','name'])['ratio'].unstack() 
print (df) 
name     bar foo 
DayOfWeek HourOfDay    
Mon  0   0.20 0.70 
      1   0.11 0.20 
      2   NaN 0.11 
      3   NaN 0.45 
      23   NaN 0.20 
Sun  23   NaN 0.10 
Tue  0   NaN 0.10 
      1   NaN 0.60 
      2   NaN 0.20 

을하지만 중복 ... mean, sum 같은 일부 집계 FUNC와 pivot_table을 필요로하는 경우