我有一个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的切片。
最佳答案
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
并带有mean
,sum
...等聚合函数,则: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/