python - 创建多索引(3 轴)以取 1 轴的平均值
问题描述
我有一个 DataFrames 列表,其中包含一个带有日期时间索引的时间序列。我有另一个名为 longname 的列表,我想将其关联到每个数据框。我想将这些 Dataframes-longname 与 Mainlabel 列表(通过 longname by , MainName,SubName 相关联)分组。现在我想通过 longname 和 MainNames 从数据框中获取相对于日期时间索引的平均值。如果这听起来令人困惑,我很抱歉。
我想到的是令人困惑和复杂的。所以我想知道是否有人有我应该采取的更好的方法。到目前为止,我所做的是使用 pd.concat() 将数据帧列表扩展为 1 列,但似乎无法使用长名称的“keys”参数来标记它们,这给了我一个错误,
ValueError: Shape of passed values is (823748, 2), indices imply (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
解决方案
样品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
然后有必要选择MultiIndex
by 的第一级Index.get_level_values
:
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
推荐阅读
- android - IONIC 3 - 无法构建发布 android apk
- javascript - 如何使用js以特定顺序运行弹出窗口?
- python - 当我们“安装”pytorch 时会发生什么
- macos - 在 macOS 上,如何找到使用“open”命令打开的应用程序路径?
- facebook - 如何使用 Facebook 的 Graph API 检索页面的故事(关于标签)?
- python - 从 Vgg16 网络导入后如何更改瓶颈特征的输入形状
- r - 将列表组合成矩阵:“x”必须是原子的
- c# - Wpf Addin's View 覆盖其他用户控件
- r - R中Arima.sim()中模型的输入值是多少?
- javascript - chrome_url_overrides 不适用于隐身新标签