我有一个dataFrame,它是观察结果列表,按“名称”列分组。我很难将其转换为multiIndex格式。

我有类似的东西:

    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 clustermap一起使用的东西,可以显示每天(整体)“名称”的“比率”与几天之内的特定小时之间的相关性。

例如我需要类似的东西(不确定是否正确,但这就是我尝试过的):

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


一旦有了,我希望能够将它xs()分解成可用于seaborn的heatmap / clustermap的切片。

最佳答案

您可以将set_indexunstack结合使用:

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


但是,如果重复项需要pivot_table并带有meansum ...等聚合函数,则:

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

关于python - 如何将Pandas DataFrame转换为Clustermap的MultiIndexed形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43310846/

10-11 19:38