Панды keep_default_na = Ложь не работает - PullRequest
0 голосов
/ 19 ноября 2018

Выпуск

У меня есть файл Excel (.xlsx), который содержит лист с некоторыми значениями, равными '# N / A'.

image

When reading the Excel sheet as a DataFrame using pandas, '#N/A' values are interpreted as NaN.

Based on the pandas.read_excel Руководство, я ожидаю, что «# N / A» можно прочитать «как есть» в DataFrame, добавив параметр keep_default_na=False.

К сожалению, '# N / A' все еще интерпретируется как NaN.

код

Вот код, используемый:

df = pd.read_excel(io='TestWorkbook.xlsx',
              sheet_name="Sheet1",
              keep_default_na=False)

И результат:

image

Кажется, что keep_default_na=False работал со значениями 'N / A' и 'NA', но не с '# N / A'.

Вопрос

Знаете ли вы какой-нибудь обходной путь для чтения '# N / A' как есть в DataFrame?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Это потому, что Excel не хранит эти #N/A значения в столбце B в виде строк. Существует визуальная индикация этого, если вы заметите, что эти #N/A ячейки выровнены по центру.

Панды не будут различать различные типы ошибок Excel: #N/A / #NUM! / #NAME? / #VALUE! и т. Д. Будут отображаться как NaN. Что имеет смысл, для каждой ошибки Excel не существует параллельного типа Python / C.

Короче говоря, с pd.read_excel вы ничего не можете сделать, кроме как переопределить все ошибки с определенной строкой, например, '#N/A' и потеряете все знания о конкретных типах ошибок, обнаруженных вами, открыв файл в Excel:

df['Column2'] = df['Column2'].fillna('#N/A')

Альтернативой является принудительное использование Excel для использования текстовых значений, например, вставив в ячейку Excel:

=TEXT("#N/A", "")

Затем прочитайте, используя pd.read_excel с keep_default_na=False. Это кажется больше проблем, чем стоит.

0 голосов
/ 19 ноября 2018

Попробуйте:

df = pd.read_excel(
    io='TestWorkbook.xlsx',
    sheet_name="Sheet1",
    na_values='', keep_default_na=False
)

Если вы укажете keep_default_na=False, значения, указанные в na_values, перезапишут значения NA по умолчанию. Поскольку ваши значения NA находятся в значениях NA по умолчанию, вам необходимо указать некоторые na_values='some_dummy_na_value', чтобы использовать их для перезаписи значений NA по умолчанию.

Если вы, например, хотите продолжать интерпретировать N/A и NA как значения NA (сохраняя #N/A как строку), вы можете указать их в параметре na_values:

df = pd.read_excel(
    io='TestWorkbook.xlsx',
    sheet_name="Sheet1",
    na_values=['N/A', 'NA'], keep_default_na=False
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...