创建一个多索引(3轴)以取1轴的平均值

时间:2019-03-30 14:45:00

标签: python pandas

我有一个DataFrame列表,其中包含一个带有日期时间索引的时间序列。我还有另一个名为longname的列表,我希望与每个这些Dataframe关联。我想将这些Dataframes-longname与Mainlabel列表进行分组(通过longname关联的MainName,SubName)。现在,我想通过长名称和MainName从数据框中获取相对于日期时间索引的平均值。很抱歉,这听起来令人困惑。

我的想法是令人困惑和复杂。所以我想知道是否有人可以采用更好的方法。 到目前为止,我所做的是使用pd.concat()将数据帧列表扩展为1列,但似乎无法使用longname的“ keys”参数来标记它们,这给我一个错误, ValueError: Shape of passed values is (823748, 2), indices imply (3343070, 2)。 这使我的第二个索引器松动。如果可以的话,我希望可以使用简称.eg轻松地将它们分组。

ShortNames = ['MainName1','MainName2']

idx = allvars.index.str.extract('('+ '|'.join(ShortNames) + ')', expand=False)

Allmean = allvars.groupby(idx).mean(axis = (1,2,3))

我有多个看起来像这样的数据框;

            Amount(mm)
Date                  
1900-01-01         0.0
1900-01-02         0.0
1900-01-03         5.1
1900-01-04         0.0
1900-01-05         0.0
1900-01-06         0.0
1900-01-07         0.0

我的长名列表如下:

longnames = ['MainName1,SubName1', 'MainName1,SubName2', 'MainName2,SubName1', 'MainName2,SubName2']

总的来说,我只想在datetime索引上取平均值,但归为MainNames。因此,这将导致只有2个索引。这是MainName和DateTime索引。类似于;

                               Amount(mm)
                   Date                  
MainName1          1900-01-01         0.0
                   1900-01-02         0.0
                   1900-01-03         5.1
                   1900-01-04         0.0
                   1900-01-05         0.0
                   1900-01-06         0.0
                   1900-01-07         0.0
MainName2          1900-01-04         8.0
                   1900-01-05         9.0
                   1900-01-06         1.0
                   1900-01-07         2.0

1 个答案:

答案 0 :(得分:1)

示例DataFrames

print (df1)
print (df2)
print (df3)
            Amount(mm)
Date                  
1900-01-01         0.0
1900-01-02         0.0
1900-01-03         5.1
1900-01-04         0.0
1900-01-05         0.0
1900-01-06         0.0
1900-01-07         0.0
            Amount(mm)
Date                  
1900-01-01         4.0
1900-01-02         5.0
1900-01-03         5.1
1900-01-04         6.0
            Amount(mm)
Date                  
1900-01-04         8.0
1900-01-05         9.0
1900-01-06         1.0
1900-01-07         2.0

首先,列表longsnames的长度必须与数字DataFrames(此处为3)相同

dfs = [df1,df2,df3]
longsnames = ['MainName1,SubName1', 'MainName1,SubName2', 'MainName2,SubName1']

allvars = pd.concat(dfs, keys = longsnames)
print (allvars)
                               Amount(mm)
                   Date                  
MainName1,SubName1 1900-01-01         0.0
                   1900-01-02         0.0
                   1900-01-03         5.1
                   1900-01-04         0.0
                   1900-01-05         0.0
                   1900-01-06         0.0
                   1900-01-07         0.0
MainName1,SubName2 1900-01-01         4.0
                   1900-01-02         5.0
                   1900-01-03         5.1
                   1900-01-04         6.0
MainName2,SubName1 1900-01-04         8.0
                   1900-01-05         9.0
                   1900-01-06         1.0
                   1900-01-07         2.0

然后有必要通过Index.get_level_values选择MultiIndex的第一级:

ShortNames = ['MainName1','MainName2']

idx = allvars.index.get_level_values(0).str.extract('('+ '|'.join(ShortNames) + ')', expand=False)
print (idx)
Index(['MainName1', 'MainName1', 'MainName1', 'MainName1', 'MainName1',
       'MainName1', 'MainName1', 'MainName1', 'MainName1', 'MainName1',
       'MainName1', 'MainName2', 'MainName2', 'MainName2', 'MainName2'],
      dtype='object')

最后一个汇总mean

Allmean = allvars.groupby([idx, 'Date']).mean()
#oldier pandas version alternative
#Allmean = allvars.groupby([idx, allvars.index.get_level_values(1)]).mean()
print (Allmean)
                      Amount(mm)
          Date                  
MainName1 1900-01-01         0.0
          1900-01-02         0.0
          1900-01-03         5.1
          1900-01-04         0.0
          1900-01-05         0.0
          1900-01-06         0.0
          1900-01-07         0.0
MainName2 1900-01-01         4.0
          1900-01-02         5.0
          1900-01-03         5.1
          1900-01-04         6.0