熊猫keep_default_na = False不起作用

时间:2018-11-19 13:25:06

标签: python excel pandas

问题

我有一个Excel文件(.xlsx),其中包含带有某些值等于“#N / A”的工作表。

使用熊猫将Excel工作表作为DataFrame读取时,“#N / A”值将解释为NaN。

根据pandas.read_excel指南,我希望可以通过添加keep_default_na=False参数将'#N / A'照原样读取到DataFrame中。

不幸的是,'#N / A'仍被解释为NaN。

代码

以下是使用的代码:

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

结果:

似乎keep_default_na=False处理'N / A'和'NA'值,而不是'#N / A'。

问题

您知道将“#N / A”原样读取到DataFrame中的任何解决方法吗?

2 个答案:

答案 0 :(得分:1)

这是因为Excel不会将B列中的#N/A值存储为字符串。如果您注意到这些#N/A单元格是居中对齐的,则有一个直观的指示

熊猫不会区分不同类型的Excel错误:#N/A / #NUM! / #NAME? / #VALUE!等都将以NaN的形式出现。这很有意义,对于每个Excel错误,没有并行的Python / C类型。

因此,简而言之,pd.read_excel除了用特定字符串覆盖 all 错误之外,您无能为力。 '#N/A',并通过在Excel中打开文件来丢失对找到的特定错误类型的所有了解:

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

替代方法是 force Excel使用文本值,例如通过插入Excel单元格:

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

然后使用pd.read_excelkeep_default_na=False进行读取。这似乎比其应有的麻烦还要多。

答案 1 :(得分:0)

尝试:

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/ANA解释为NA值(同时将#N/A保留为字符串),则可以在na_values中指定它们参数:

df = pd.read_excel(
    io='TestWorkbook.xlsx',
    sheet_name="Sheet1",
    na_values=['N/A', 'NA'], keep_default_na=False
)