将pandas multiindex转换为列名的简单平面索引

时间:2015-09-24 15:10:01

标签: python pandas

我有一个像这样的pandas数据框:

columns = pd.MultiIndex.from_tuples([
        ('A', 'cat', 'long'), ('A', 'cat', 'long2'),
        ('A', 'dog', 'short'), ('B', 'dog', 'short')
    ],
    names=['exp', 'animal', 'hair_length']
)
df = pd.DataFrame(np.random.randn(4, 4), columns=columns, index=['W', 'X', 'Y', 'Z'])

这导致了这种结构:

exp                 A                             B
animal            cat                 dog       dog
hair_length      long     long2  short     short
W            1.088097 -0.104486  2.574262 -0.614482
X           -0.088731  0.620010  0.101627 -0.518250
Y           -0.687172  0.108860 -1.932803  1.104636
Z            2.453511  0.947065 -2.144457  1.036991

我现在需要将列结构“扁平化”为一个简单的列名列表,例如A_cat_long,A_dog_short等。

以下命令似乎有效:

df.columns = [ '_'.join(x) for x in df.columns ]

   A_cat_long  A_cat_long2  A_dog_short  B_dog_short
W   -0.968703     0.086291    -0.255741     1.487564
X    2.113484    -0.118909     0.698032    -0.058647
Y    0.822555     0.483175     1.221687     0.759047
Z   -1.260217     1.620935     0.417836     1.581388

有人可以确认这是否是正确的方法吗?

1 个答案:

答案 0 :(得分:3)

如果有其他人遇到过这个问题 - 这似乎确实可以解决问题:

df.columns = [ '_'.join(x) for x in df.columns ]

结果:

   A_cat_long  A_cat_long2  A_dog_short  B_dog_short
W   -0.968703     0.086291    -0.255741     1.487564
X    2.113484    -0.118909     0.698032    -0.058647
Y    0.822555     0.483175     1.221687     0.759047
Z   -1.260217     1.620935     0.417836     1.581388