【问题标题】:pandas hierarchical index slicing based on year indexpandas 基于年份索引的层次索引切片
【发布时间】:2021-08-27 20:34:08
【问题描述】:

我有一个数据集,data1。我正在尝试使用基于input的索引切片

在哪里data1 =

                  stats
gender  year    
        
women   2003    cellphone use
        2007    height
        2007    cigarette use
        2008    weight
        2009    cellphone use
        2015    cigarette use
        2018    weight
        2020    height

这是我对索引切片的尝试:

 isvalid_yr = False
 while not isvalid_yr:
     year_input = int(input("Input the year you want to compare data from: "))
     if year_input in data1.index.get_level_values('year') 
         idx = pd.IndexSlice
         isvalid_yr = True
         new_data1 = data1.loc(axis = 0)[idx[year_input:year_input], idx[:]]
     else:
          isvalid_yr = False
     try:
         if isvalid_yr ==True:
             pass
         else:
             raise ValueError("Year not in data!")
         except ValueError as err:
             print("Year not in data!")

它给了我这个我不想要的输出。

Empty DataFrame
Columns: [stats]
Index: []

我想要实现的最终期望输出如下所示

Input the year you want to compare data from: 2007

new_data1 =的结果

                  stats
gender  year    

women   
        2007    height
        2007    cigarette use

【问题讨论】:

  • 这里有错误? if prompt_yr in data1.index.get_level_values('year')prompt_yr 不应该是 year_input 吗?
  • 很好,谢谢!

标签: python pandas indexing hierarchical


【解决方案1】:

使用xs 抓取DataFrame 的横截面:

res = df.xs(2007, axis=0, level='year', drop_level=False)

res:

                     stats
gender year               
women  2007         height
       2007  cigarette use

使用用户输入:

while True:
    try:
        year_input = int(
            input("Input the year you want to compare data from: ")
        )
        res = df.xs(year_input, axis=0, level='year', drop_level=False)
        break
    except KeyError:
        print("Year not in data!")
    except ValueError:
        print("Please enter a valid year")

df 已使用:

df = pd.DataFrame({
    'gender': ['women', 'women', 'women', 'women', 'women', 'women', 'women',
               'women'],
    'year': [2003, 2007, 2007, 2008, 2009, 2015, 2018, 2020],
    'stats': ['cellphone use', 'height', 'cigarette use', 'weight',
              'cellphone use', 'cigarette use', 'weight', 'height']
}).set_index(['gender', 'year'])

df:

                     stats
gender year               
women  2003  cellphone use
       2007         height
       2007  cigarette use
       2008         weight
       2009  cellphone use
       2015  cigarette use
       2018         weight
       2020         height

【讨论】:

  • 谢谢!有没有办法将我的输入转换为int?我最好将其保留为 year_input = input("输入您要比较数据的年份:")
  • 如果您的年份值是 int 类型,则不会。
  • 我想以某种方式阻止程序在用户输入字符串或非 int 输入时终止。例如,如果用户输入“asdas”,我希望它简单地重新提示消息“无效年份,再次输入”。而不是终止程序。
  • 添加except 以捕获值错误。查看编辑。
猜你喜欢
  • 2021-08-25
  • 2015-03-16
  • 2018-12-29
  • 2021-07-28
  • 1970-01-01
  • 2018-06-16
  • 2018-05-20
  • 2015-08-21
  • 1970-01-01
相关资源
最近更新 更多