来自MultiIndex和NumPy结构化数组的Pandas DataFrame(重新排列)

时间:2016-06-09 17:17:24

标签: python numpy pandas dataframe multi-index

首先,我创建了一个两级MultiIndex

import numpy as np
import pandas as pd

ind = pd.MultiIndex.from_product([('X','Y'), ('a','b')])

我可以这样使用它:

pd.DataFrame(np.zeros((3,4)), columns=ind)

给出了:

     X         Y     
     a    b    a    b
0  0.0  0.0  0.0  0.0
1  0.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0

但现在我正在尝试这样做:

dtype = [('Xa','f8'), ('Xb','i4'), ('Ya','f8'), ('Yb','i4')]
pd.DataFrame(np.zeros(3, dtype), columns=ind)

但是这给了:

Empty DataFrame
Columns: [(X, a), (X, b), (Y, a), (Y, b)]
Index: []

我期待类似于之前的结果,有三行。

也许更一般地说,我想要做的是生成一个带有MultiIndex列的Pandas DataFrame,其中列具有不同的类型(如示例中所示,a是浮点数但b是int)。

2 个答案:

答案 0 :(得分:2)

这看起来像一个错误,值得报告as an issue github

解决方法是在构建后手动设置列:

In [11]: df1 = pd.DataFrame(np.zeros(3, dtype))

In [12]: df1.columns = ind

In [13]: df1
Out[13]:
     X       Y
     a  b    a  b
0  0.0  0  0.0  0
1  0.0  0  0.0  0
2  0.0  0  0.0  0

答案 1 :(得分:1)

pd.DataFrame(np.zeros(3, dtype), columns=ind)

Empty DataFrame
Columns: [(X, a), (X, b), (Y, a), (Y, b)]
Index: []

只显示数据框输出的文本表示。

Columns: [(X, a), (X, b), (Y, a), (Y, b)]

只是索引的文本表示。

如果您改为:

df = pd.DataFrame(np.zeros(3, dtype), columns=ind)

print type(df.columns)

<class 'pandas.indexes.multi.MultiIndex'>

你看它确实是pd.MultiIndex

那说了然后就走开了。我不明白的是为什么在dataframe构造函数中指定索引会删除值。

解决这个问题。

df = pd.DataFrame(np.zeros(3, dtype))

df.columns = ind

print df

     X       Y   
     a  b    a  b
0  0.0  0  0.0  0
1  0.0  0  0.0  0
2  0.0  0  0.0  0