14

创建DataFrame具有分层列的最简单方法是什么?

我目前正在从名称的字典中创建一个 DataFrame ->Series使用:

df = pd.DataFrame(data=serieses)

我想使用相同的列名,但在列上添加额外的层次结构。暂时我希望附加级别对列具有相同的值,比如说“估计”。

我正在尝试以下方法,但这似乎不起作用:

pd.DataFrame(data=serieses,columns=pd.MultiIndex.from_tuples([(x, "Estimates") for x in serieses.keys()]))

我得到的只是一个包含所有 NaN 的 DataFrame。

例如,我正在寻找的大致是:

l1               Estimates    
l2  one  two  one  two  one  two  one  two
r1   1    2    3    4    5    6    7    8
r2   1.1  2    3    4    5    6    71   8.2

其中 l1 和 l2 是 MultiIndex 的标签

4

4 回答 4

14

这似乎有效:

import pandas as pd

data = {'a': [1,2,3,4], 'b': [10,20,30,40],'c': [100,200,300,400]}

df = pd.concat({"Estimates": pd.DataFrame(data)}, axis=1, names=["l1", "l2"])

l1  Estimates         
l2          a   b    c
0           1  10  100
1           2  20  200
2           3  30  300
3           4  40  400
于 2013-08-02T02:13:37.107 回答
10

我知道这个问题真的很老,但对于pandas版本0.19.1一可以使用直接字典初始化:

d = {('a','b'):[1,2,3,4], ('a','c'):[5,6,7,8]}
df = pd.DataFrame(d, index=['r1','r2','r3','r4'])
df.columns.names = ('l1','l2')
print df

l1  a   
l2  b  c
r1  1  5
r2  2  6
r3  3  7
r4  4  8
于 2017-03-20T07:24:37.900 回答
2

我不确定,但我认为使用 dict 作为 DF 的输入MulitIndex 不能很好地配合使用。改为使用数组作为输入使其工作。

不过,我通常更喜欢 dicts 作为输入,一种方法是在创建 df 之后设置列:

import pandas as pd

data = {'a': [1,2,3,4], 'b': [10,20,30,40],'c': [100,200,300,400]}
df = pd.DataFrame(np.array(data.values()).T, index=['r1','r2','r3','r4'])

tups = zip(*[['Estimates']*len(data),data.keys()])

df.columns = pd.MultiIndex.from_tuples(tups, names=['l1','l2'])

l1          Estimates         
l2          a   c    b
r1          1  10  100
r2          2  20  200
r3          3  30  300
r4          4  40  400

或者当使用数组作为 df 的输入时:

data_arr = np.array([[1,2,3,4],[10,20,30,40],[100,200,300,400]])

tups = zip(*[['Estimates']*data_arr.shape[0],['a','b','c'])
df = pd.DataFrame(data_arr.T, index=['r1','r2','r3','r4'], columns=pd.MultiIndex.from_tuples(tups, names=['l1','l2']))

这给出了相同的结果。

于 2013-08-01T06:27:29.840 回答
0

Rutger Kassies 的解决方案适用于我的情况,但我在列层次结构的“上层”中有不止一列。只是想提供对我有用的例子,因为它是一个更普遍的情况。

首先,我的数据如下所示:

> df
         (A, a)    (A, b)       (B, a)    (B, b) 
0         0.00     9.75         0.00       0.00
1         8.85     8.86         35.75      35.50
2         8.51     9.60         66.67      50.70
3         0.03     508.99       56.00      8.58

我希望它看起来像这样:

> df
                A                    B
           a        b            a          b
0         0.00     9.75         0.00       0.00
1         8.85     8.86         35.75      35.50
...

解决方案是:

tuples = df.transpose().index
new_columns = pd.MultiIndex.from_tuples(tuples, names=['Upper', 'Lower'])
df.columns = new_columns

这是违反直觉的,因为为了创建列,我必须通过索引来完成。

于 2021-09-15T13:21:47.367 回答