首页 > 解决方案 > 在 pandas.melt 之后保留列索引?

问题描述

我有一个值随时间变化的数据框。例如,我在街道上观察到的汽车数量:

df = pd.DataFrame(
    [{'Orange': 0, 'Green': 2, 'Blue': 1},
     {'Orange': 2, 'Green': 4, 'Blue': 4},
     {'Orange': 1, 'Green': 3, 'Blue': 10}
    ])

我想创建突出显示具有最高值的汽车的图表。所以我按最大值排序。

df.loc[:, df.max().sort_values(ascending=False).index]
   Blue  Green  Orange
0     1      2       0
1     4      4       2
2    10      3       1

我正在使用 seaborn 创建这些图表。据我了解,我需要将这种表示形式融合为一种整洁的格式。

tidy = pd.melt(df.reset_index(), id_vars=['index'], var_name='color', value_name='number')
   index   color  number
0      0    Blue      1
1      1    Blue      4
2      2    Blue     10
3      0   Green      2
4      1   Green      4
5      2   Green      3
6      0  Orange      0
7      1  Orange      2
8      2  Orange      1

如何在数据框熔化之前添加表示列顺序的列?

   index   color  number   importance
0      0    Blue      1            0
1      1    Blue      4            0
2      2    Blue     10            0
3      0   Green      2            1
4      1   Green      4            1
5      2   Green      3            1
6      0  Orange      0            2 
7      1  Orange      2            2
8      2  Orange      1            2

我看到融化后我仍然可以找到最大列,但我不确定如何将其作为新列添加到数据框中:

tidy.groupby('color').number.max().sort_values(ascending=False).index
Index(['Blue', 'Green', 'Orange'], dtype='object', name='color')

编辑 为了澄清,我将其绘制在折线图上。

axes = sns.relplot(data=tidy, x='index', y='number', hue='color', kind="line")

这是图表当前的样子: 汽车样本图

我想使用重要性数据来:对线条着色/加粗,或者将图形拆分为多个图形,所以它看起来像这样

汽车样本图 汽车样本图

标签: pythonpandasdataframeseaborn

解决方案


您可以MultiIndex在列上制作一个,然后堆叠两个级别。

# Map color to importance
d = (df.max().rank(method='dense', ascending=False)-1).astype(int)

df.columns = pd.MultiIndex.from_arrays([df.columns, df.columns.map(d)],
                                       names=['color', 'importance'])
#color      Orange Green Blue
#importance      2     1    0
#0               0     2    1
#1               2     4    4
#2               1     3   10

df = df.rename_axis(index='index').stack([0,1]).to_frame('value').reset_index()

   index   color  importance  value
0      0    Blue           0    1.0
1      0   Green           1    2.0
2      0  Orange           2    0.0
3      1    Blue           0    4.0
4      1   Green           1    4.0
5      1  Orange           2    2.0
6      2    Blue           0   10.0
7      2   Green           1    3.0
8      2  Orange           2    1.0

推荐阅读