Я применил методологию .loc, описанную в Выберите строки в мультииндексном фрейме данных pandas, потому что я получал KeyError: «класс», хотя «класс» существует как (я думал, что это имя столбца) в моем существующем фрейме данных. Позже выяснилось, что «класс» был одним из двух индексов в мультииндексе («группа» была вторичным индексом). Хотя функция .loc позволяет мне выбирать строки с «Первым», «Вторым», «Третьим», я изо всех сил пытаюсь определить, как затем применить дополнительное условие для исключения строк, где второй индекс («группа») имеет пустые строки .
Текущий фрейм данных выглядит так:
Текущий код выглядит так:
keep_rows = df.loc[['First','Second','Third']]
Мой исходный код выглядел так (и выдавал KeyError из-за ссылочных имен за индексами, а не имен столбцов)
keep_rows = df[(df['class'].isin(['First','Second','Third'])) & (df['group'].isna())]
Желаемый фрейм данных:
keep_rows = df.reset_index().loc[df['класс'].isin(['Первый', 'Второй', 'Третий']) & df['группа'].notna()]
df = df.dropna()[['class', 'group', 'Column1']].head(3) может быть немного неуклюжим, но он дает желаемый фрейм данных :).
@Moid ваш скрипт привел к исходной ошибке KeyError: 'class'






Вы можете использовать get_level_values :
>>> df[(df.index.get_level_values('class').isin(['First','Second','Third']))
& (df.index.get_level_values('group') != '')]
Column1
class group
First A 123.0
Second B 123.0
Third C 123.0
Подробности:
>>> df.index.get_level_values('class').isin(['First','Second','Third'])
array([ True, True, True, True, False])
>>> df.index.get_level_values('group').notna()
array([ True, False, True, True, True])
Это было выполнено успешно, но не удалило строки с пустыми значениями в столбце «группа».
Возможно, потому что у вас нет значений NaN, но есть пустая или 'NaN' строка?
внутри df ячейки пусты. есть ли другой способ удалить эти строки?
Можете ли вы предоставить вывод print(df.index)
MultiIndex([('Первый', 'А'),('Первый', ''),('Второй', 'Б'),('Третий', 'С')], имена=['класс', 'группа'])
Поэтому вам нужно проверить пустую строку (я обновил свой ответ), а не нулевое значение.
Да, я применил вышеуказанное изменение, и оно было успешным. Принял ваш ответ. Спасибо!
Попробуйте ваше решение с помощью notna() с индексом сброса