在Python中的pandas数据帧中制作多索引?

时间:2015-06-02 17:01:29

标签: python pandas dataframe

我有一个数据集,其中有一个由时间变量索引的数值矩阵。每个矩阵都是一个numpy数组(可以转换为数据帧,其列对应于矩阵的列)。如果我有这些矩阵,我怎样才能将它们组成一个数据帧,每个矩阵都有一个时间索引?具体是:

# time t1
d1 = pandas.DataFrame({"a": [1,2,3,4], "b":[10,20,30,40]})
# time t2
d2 = pandas.DataFrame({"a": [10,20,30,40], "b": [1,2,5,6]})
# time t3 
d3 = ...

我想创建一个名为“time”的索引来索引这些数据帧,然后在时间索引中聚合来自“a”和“b”列的值。你怎么能在熊猫里做到这一点?

我的尝试:

d=pandas.DataFrame([d1,d2],index=(0, 1),columns=["time"])

update :unutbu的添加两个分层列的解决方案是:

c = pd.concat([d1, d2], keys=[('t1', 'p1'), ('t2', 'p2')], names=['time', 'position'])

我的最后一个问题是你如何访问这个结果结构?例如,如何在timeposition之间进行矢量化操作?例如,取time的每个值的行的平均值。

另外,这与将timeposition编码到每个数据框并使用groupby相比如何?换句话说,何时使用级别与分组的平面列?这是使用flatby数据帧的替代解决方案:

d1["time"] = 1
d1["position"] = "x"
d2["time"] = 2
d2["position"] = "y"
c = pandas.concat([d1, d2])
# take mean for all time values
c.groupby("time").apply(lambda x: np.mean(x, axis=1))

1 个答案:

答案 0 :(得分:1)

鉴于

import pandas as pd

d1 = pd.DataFrame({"a": [1,2,3,4], "b":[10,20,30,40]})
d2 = pd.DataFrame({"a": [10,20,30,40], "b": [1,2,5,6]})

然后pd.concat([d1, d2], keys=['t1', 't2'])返回:

In [177]: pd.concat([d1, d2], keys=['t1', 't2'])
Out[177]: 
       a   b
t1 0   1  10
   1   2  20
   2   3  30
   3   4  40
t2 0  10   1
   1  20   2
   2  30   5
   3  40   6

如果您希望为新的MultiIndex添加多个级别,则可以将元组列表传递给keys参数:

In [237]: pd.concat([d1, d2], keys=[('t1', 'p1'), ('t2', 'p2')], names=['time', 'position'])
Out[237]: 
                  a   b
time position          
t1   p1       0   1  10
              1   2  20
              2   3  30
              3   4  40
t2   p2       0  10   1
              1  20   2
              2  30   5
              3  40   6

请注意,keys收到元组列表非常重要,而不是列表列表。