Как сравнить значение столбца Pandas DataFrame с многоуровневым индексом? - PullRequest
0 голосов
/ 11 июня 2018

Вот мой пример 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, чем значение в Threshold или нет.

Я попробовал следующее:

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

, который вернул True для всех строк.Как сравнить значение в столбце Temp с соответствующим значением в индексе Threshold?

РЕДАКТИРОВАТЬ: Приведенная выше логика верна, моя программа возвращала True для всех строк, потому что dtype столбца Temp было object и Threshold index был int, поэтому сравнение возвращало сомнительные результаты.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы должны быть в состоянии использовать 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")
0 голосов
/ 11 июня 2018

Ваше решение работает отлично.Я полагаю, что проблема заключается в том, как определяется ваш индекс.Ниже приведен пример того, как вы можете явно установить свой индекс и как должен выглядеть 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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...