python - 将具有分层列索引的宽格式 pandas DataFrame 转换为整齐格式

标签 python pandas seaborn

我正在尝试创建一个 seaborn facet plot具有层次索引的 pandas 数据框。第一个代码块生成类似于我必须使用的数据集的内容

from itertools import product, repeat
import pandas as pd
import numpy as np
from pandas import DataFrame, Series
import seaborn as sns
import matplotlib.pyplot as plt

dummy = np.random.random((4, 4))

cols = pd.MultiIndex.from_tuples(list(product('ab', 'cd')),
                                 names=['foo', 'bar'])
dat1 = DataFrame(dummy, columns=cols)

看起来像

foo         a                   b          
bar         c         d         c         d
0    0.266058  0.345076  0.339332  0.176753
1    0.094610  0.393542  0.838283  0.314625
2    0.598301  0.831869  0.277067  0.854321
3    0.910993  0.688163  0.158744  0.570700

并且不能与 FacetGrid 一起使用——至少,它不是 FacetGrid 想要使用的形式。我可以对数据进行一些快速而肮脏的操作

dfs  = [DataFrame([Series(dummy[:, i], name='obs'),
                   Series(list(repeat(cols.values[i][0], 4)), name='foo'),
                   Series(list(repeat(cols.values[i][1], 4)), name='bar')],).T
        for i in range(4)]
dat2 = pd.concat(dfs)

让它看起来像

         obs foo bar
0   0.266058   a   c
1  0.0946101   a   c
2   0.598301   a   c
3   0.910993   a   c
0   0.345076   a   d
1   0.393542   a   d
2   0.831869   a   d
3   0.688163   a   d
0   0.339332   b   c
1   0.838283   b   c
2   0.277067   b   c
3   0.158744   b   c
0   0.176753   b   d
1   0.314625   b   d
2   0.854321   b   d
3     0.5707   b   d

看起来像 seaborn example gallery 中的数据。我的问题是,是否有一个 DataFrame 或 Index 方法来为我完成这种转换。看起来它应该存在,但我还没有在文档中找到它。

最佳答案

这似乎有效:

dat1.unstack().reset_index(["foo", "bar"], name="obs")


  foo bar       obs
0   a   c  0.716688
1   a   c  0.945587
2   a   c  0.388928
3   a   c  0.597745
0   a   d  0.201622
1   a   d  0.267941
2   a   d  0.575878
3   a   d  0.632626
0   b   c  0.143869
1   b   c  0.499576
2   b   c  0.860764
3   b   c  0.369183
0   b   d  0.857490
1   b   d  0.048870
2   b   d  0.804838
3   b   d  0.230868

关于python - 将具有分层列索引的宽格式 pandas DataFrame 转换为整齐格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35558863/

相关文章:

python - 打开网页并返回所有链接及其文本的字典的函数

python - 如何阻止 WSGI 挂起 apache

python - 斯科特是谁? - Seaborn pairplot : Could not convert string to float: 'scott' 中的 ValueError

Python:Pandas Groupby 然后失败率

python - 在 Pandas 数据框中将第二行移到上方一行

python - 无法更改 seaborn regplot 回归线的大小?

python - 使用多级 Pandas Dataframe 的 Seaborn Plot 时遇到问题

python - 如何为每组 pandas 列创建一个子图

python - 如何使用 python 绘制从 RTL SDR 接收到的信号的实时图?

python - 使用带有分类数据的 seaborn barplot 的困难