首页 > 解决方案 > 对 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 命令,我会很感激,也可以随意提出更好的解决方案,可能有更好的方法来做到这一点,请记住,我有很多带有时间戳的表格。

标签: pythonpandasdataframe

解决方案


有多种方法可以从具有 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


推荐阅读