以下是我的示例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
,因此比较返回了不稳定的结果。
答案 0 :(得分:4)
您的解决方案正常。我建议问题在于如何定义索引。下面是一个示例,说明如何明确设置索引以及成功定义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'])
答案 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")