我正在尝试创建一个 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/