【问题标题】:Python pandas multiindex getting info from seriesPython pandas multiindex 从系列中获取信息
【发布时间】:2015-06-13 05:02:53
【问题描述】:

我从时间序列创建了一个多索引熊猫系列,现在我想读取其中的数据。在我看到的所有示例中,该系列的列或级别都已命名。但是,在我的系列中并非如此。在这个多索引中,第一级是日期,第二级是一天中的小时。数据列有我要读取的值。

从我的系列中获取我想要的数据的最简单方法是什么?下面的代码应该很容易解释。

   import pandas as pd
   import numpy as np

   n = 1000
   t = pd.date_range(start ='2012-01-01', periods=n, freq='10T')
   x = np.random.randn(n)
   df = pd.Series(data=x, index=t)


   df1 = df[(df > 1) & (df < 1.5)]
   df2 = df1.groupby([df1.index.date, df1.index.hour]).count()

   df2.head(15)
   #How do I get the data out of df2?
   #For example, I want to read the data for '2012-01-02 01:00'

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    您可以通过在一个元组中提供两个标签来访问多索引系列中的元素。例如:

    In [19]: df2[(datetime.date(2012,1,2), 3)]
    Out[19]: 2
    

    但是,这不是那么方便。所以我认为在这种情况下最好不要构造多索引。
    您可以将现有的多索引转换为平面索引,但我认为这里有一种更好的方法,可以让 groupby 略有不同。使用 Grouper 对象,我可以指定每小时对 DatetimeIndex 进行分组:

    In [120]: df2 = df1.groupby(pd.Grouper(freq='H')).count()
    
    In [121]: df2.head()
    Out[121]:
    2012-01-01 02:00:00    2
    2012-01-01 03:00:00    1
    2012-01-01 04:00:00    2
    2012-01-01 05:00:00    1
    2012-01-01 06:00:00    1
    Freq: H, dtype: int64
    
    In [123]: df2['2012-01-02 03:00']
    Out[123]: 2
    

    如您所见,结果仍然有 DatetimeIndex,但频率为每小时一次。因此,您可以轻松地使用日期时间字符串进行索引(这在多索引方法中是不可能的)

    注意:上面的groupby其实等价于更简单的resample

    df1.resample('H', how='count')
    

    【讨论】:

    • 嗯,我在尝试使用您的多索引示例时不断收到 KeyErrors。不同的 groupby 方法确实很好用。您解决了我的问题,但我仍然想知道如何使用多索引来解决问题
    • 你能显示确切的 KeyError 和给出错误的代码行吗?
    • 没关系,它有效。我的随机数据在我尝试检索的一小时内没有任何数据。谢谢
    猜你喜欢
    • 2020-07-17
    • 2019-11-27
    • 1970-01-01
    • 2019-01-07
    • 2019-08-27
    • 2023-01-17
    • 2021-07-04
    • 1970-01-01
    • 2018-02-02
    相关资源
    最近更新 更多