代码之家  ›  专栏  ›  技术社区  ›  Rakesh Adhikesavan

如何将pandas数据帧列值与多级索引进行比较?

  •  1
  • Rakesh Adhikesavan  · 技术社区  · 8 年前

    这是我的示例数据帧 df_output 多层次索引。

    City Name   Threshold          Temp    
    Atlanta        86      0       87      
                           1       86      
                           2       85       
                           3       89   
    Chicago       90       0       92
                           1       90
                           2       85
                           3       65
    

    我正在尝试创建一个新列,该列指示 Temp 列是否大于阈值中的值。

    我尝试了以下方法:

    df_output["Temp > Threshold"] = df_output["Temp"] > df_output.index.get_level_values('Threshold')
    

    所有行都返回true。如何比较 打临时工 列中具有相应值的 Threshold 索引?

    编辑: 上面的逻辑是正确的,我的程序返回 True 因为 dtype 打临时工 柱为 object 以及 门槛 索引是 int 因此,比较结果是不可靠的结果。

    2 回复  |  直到 8 年前
        1
  •  4
  •   jpp    8 年前

    你的解决方案很好。我认为问题在于如何定义索引。下面是如何显式设置索引和什么的示例 df.index 一旦你成功地定义了 MultiIndex :

    df = pd.DataFrame({'City Name': ['Atlanta']*4 + ['Chicago']*4,
                       'Threshold': [86]*4 + [90]*4,
                       'Temp': [87, 86, 85, 89, 92, 90, 85, 65]})
    
    df = df.set_index(['City Name', 'Threshold'])
    
    df['Temp>Threshold'] = df['Temp'] > df.index.get_level_values('Threshold')
    
    print(df)
    
                         Temp  Temp>Threshold
    City Name Threshold                      
    Atlanta   86           87            True
              86           86           False
              86           85           False
              86           89            True
    Chicago   90           92            True
              90           90           False
              90           85           False
              90           65           False
    
    print(df.index)
    
    MultiIndex(levels=[['Atlanta', 'Chicago'], [86, 90]],
               labels=[[0, 0, 0, 0, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 1, 1]],
               names=['City Name', 'Threshold'])
    
        2
  •  4
  •   piRSquared    8 年前

    你应该可以使用 eval 因为它将允许您在列名旁边使用索引级别的名称。

    在线

    df.assign(gt_thresh=df.eval("Temp > Threshold"))
    
                         Temp  gt_thresh
    City Name Threshold                 
    Atlanta   86           87       True
              86           86      False
              86           85      False
              86           89       True
    Chicago   90           92       True
              90           90      False
              90           85      False
              90           65      False
    

    就位

    df[“gt_thresh”] = df.eval("Temp > Threshold")