【问题标题】:Select named index level from pandas DataFrame MultiIndex从 pandas DataFrame MultiIndex 中选择命名索引级别
【发布时间】:2019-01-26 03:09:17
【问题描述】:

我创建了一个数据框:

df1 = pandas.read_csv(ifile_name,  header=None,  sep=r"\s+",  usecols=[0,1,2,3,4],
                              index_col=[0,1,2], names=["year", "month", "day", "something1", "something2"])

现在我想创建另一个数据框,其中年份>2008。因此我尝试了:

df2 = df1[df1.year>2008]

但出现错误:

AttributeError: 'DataFrame' object has no attribute 'year'

我猜,它没有在列中看到“年份”,因为我在 index.html 中定义了它。但是在这种情况下,我如何获取基于 year>2008 的数据?

【问题讨论】:

    标签: python pandas dataframe indexing multi-index


    【解决方案1】:

    使用MultiIndex.get_level_values 按名称获取关卡并为行选择创建一个布尔掩码:

    df2 = df1[df1.index.get_level_values('year') > 2008]
    

    如果您打算进行修改,请创建df1 的副本,以免对视图进行操作。

    df2 = df1[df1.index.get_level_values('year') > 2008].copy()
    

    【讨论】:

      【解决方案2】:

      year 是索引而不是列是正确的。一种解决方案是使用pd.DataFrame.query,它可以让您直接使用索引名称:

      df = pd.DataFrame({'year': [2005, 2010, 2015], 'value': [1, 2, 3]})
      df = df.set_index('year')
      
      res = df.query('year > 2008')
      
      print(res)
      
            value
      year       
      2010      2
      2015      3
      

      【讨论】:

        【解决方案3】:

        假设您的索引已排序

        df.loc[2008:]
        Out[259]: 
              value
        year       
        2010      2
        2015      3
        

        【讨论】:

          猜你喜欢
          • 2020-06-05
          • 2015-07-19
          • 2019-05-06
          • 2019-03-05
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 2019-05-24
          相关资源
          最近更新 更多