2017-04-09 9 views
1

私はdataFrameを持っています。これは観測値のリストで、 '名前'列でグループ化されています。私はそれをmultiIndex形式に変換するのに苦労しています。その上クラスターマップの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 
.. 

と:

は、私のようなものを持っています。

私が望むのは、各日(全体として)と数日以内の特定の時間による「名前」の「比率」の間の相関関係を示すために海底のクラスターマスマップで使用できるものです。

(正しい場合はわからないが、それは私が試したものです)私のようなものが必要:

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

私はXS(のことができるようにしたいと考えていることをしたら)それはseabornからヒートマップ/ clustermapによって使用可能なスライスに。

答えて

1

あなたはunstackset_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 

をしかし、重複が... meansumのようないくつかの集計FUNCでpivot_tableが必要な場合

関連する問題