如何将Pandas DataFrame Column值与多级索引进行比较?

时间:2018-06-10 22:10:05

标签: python pandas

以下是我的示例DataFrame,名为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。如何将Temp列中的值与Threshold索引中的相应值进行比较?

编辑:上面的逻辑是正确的,我的程序为所有行返回True,因为dtype列的Temp为{{1}并且object索引是Threshold,因此比较返回了不稳定的结果。

2 个答案:

答案 0 :(得分:4)

您的解决方案正常。我建议问题在于如何定义索引。下面是一个示例,说明如何明确设置索引以及成功定义df.indexMultiIndex应该是什么样子:

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'])

答案 1 :(得分:4)

您应该可以使用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")