python - 对 Pandas MultiIndex DataFrame 进行子集化
问题描述
所以,我有一些数据表示为一个数据帧,其中的一些信息会随着时间而变化,所以对于时间 t1,我有一个数据帧 df1,时间 t2 一些数据帧 df2,等等。现在我必须将它们全部绑定在一起,有点像把表格按时间顺序依次排列:
我将它们保存为字典
{ti:dfi}
然后我将它们全部连接为一个 MultiIndex DataFrame,如下所示:
new_frame = pd.concat(frame_list, axis=0)
所以我得到一个这样的框架:
id metric1 metric2...
2020-01-01 00:00:00 0 someid1 a1 f1
1 someid2 b1 g1
2 someid3 c1 h1
3 someid4 d1 i1
4 someid5 e1 j1
...
2020-01-01 00:00:01 0 someid1 a2 f2
1 someid2 b2 g2
2 someid3 c2 h2
3 someid4 d2 i2
4 someid5 e2 j2
...
现在我想做的是,选择一些id,例如id1,我想得到一个新表,它的指标随时间变化
someid1:
metric1 metric2 ...
2020-01-01 00:00:01 a1 f1
2020-01-01 00:00:02 a2 f2 ...
2020-01-01 00:00:03 a3 f3 ...
甚至,选择一个指标,然后让它的 id 值随时间变化
metric1:
someid1 someid2 ...
2020-01-01 00:00:01 a1 b1
2020-01-01 00:00:02 a2 b2 ...
2020-01-01 00:00:03 a3 b3 ...
我可以在脑海中推断出使用一些 3 维矩阵会是什么样子,我会沿着深度轴的一条线获取所有值,但是如果有人可以提供帮助,我很难将其转换为 Pandas 命令,我会很感激,也可以随意提出更好的解决方案,可能有更好的方法来做到这一点,请记住,我有很多带有时间戳的表格。
解决方案
有多种方法可以从具有 MultiIndex 的数据框中选择行:
首先,创建一些测试数据:
import numpy as np
import pandas as pd
n = 10
dates = pd.date_range(start='2019-12-26', periods=n, freq='D')
refs = [100 * i for i in range(n)]
midx = pd.MultiIndex.from_product([dates, refs])
data = np.arange(len(midx) * 3).reshape(len(midx), 3)
df = pd.DataFrame(data, index=midx, columns=['some_id', 'metric1', 'metric2'])
现在,展示几个索引示例。我假设您的数据框由日期时间和 ID 索引:
# select a range from the outer level of the multi index
df.loc['2020-01-01' : '2020-01-03']
# two ways to select from the inner level of a multi index
df.loc[(slice(None), 100), :]
df.loc[ pd.IndexSlice[:, 100], :]
MultiIndex 功能强大,但也很复杂。此处的文档: https ://pandas.pydata.org/docs/user_guide/advanced.html
推荐阅读
- c# - 将相同的行和列添加到数据表
- javascript - 如何制作 7 天 xAxes 标签并在其中绘制 1000 个数据?
- ios - glog-0.3.5 在 iOS 中找不到 logging.h
- ios - 在 html 中为 UILabel 属性文本设置字体不起作用
- mysql - 将唯一选择值分配给唯一一个变量
- nativescript-plugin - NativeScript 插件种子演示不运行
- c# - LINQ to SQL (NHibernate):OrderBy 与 OrderByDescending 抽象
- android - 即使我提供了每页加载的数据量,数据源也总是从房间数据库中返回完整数据
- java - 如何在拆分窗格中修复我的 lineChart 缩放比例?
- excel - 我在 Excel 工作簿中有多个工作表。我需要单击按钮扫描所有这些工作表并从工作表中选择特定值