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

标签 python pandas

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

我的想法是令人困惑和复杂的。所以我想知道是否有人有我应该采取的更好的方法。 到目前为止我所做的是使用 pd.concat() 将数据帧列表扩展为 1 列,但似乎无法使用长名称的“keys”参数来标记它们,这给了我一个错误, ValueError:传递值的形状为 (823748, 2),索引暗示 (3343070, 2)。 这失去了我的第二个索引器。如果它有效的话,我希望可以使用短名称轻松地将它们分组。

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']

总的来说,我想仅取日期时间索引的平均值,但将其分组为 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

最佳答案

示例数据帧:

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')

最后一个聚合平均值:

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

关于python - 创建多索引(3 轴)以取 1 轴的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55432550/

相关文章:

python - 将具有 x 列的数据帧插入 <x 列

python - Pandas GroupBy String 连接列名而不是列值

python - i(1054, "Unknown column ' rango_category.slug' in 'field list' ") Django

python - if语句可以是变量吗?

python - Google Colab : libnvrtc. 上的 pynvrtc 所以找不到

python - 将尚未存在于另一个数据框中的列添加到数据框中

python - 需要使用 Pandas Dataframe 编辑 MySQL 表中的行子集

python - 根据另一列更改列的值

python - 基于 pandas 条件的列值总和

python - 拆分列表中的项目