Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')

Posted

技术标签:

【中文标题】Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 (\'\')【英文标题】:Python Pandas read_excel dtype str replace nan by blank ('') when reading or when writing via to_csvPython Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('') 【发布时间】:2017-12-22 05:31:37 【问题描述】:

Python 版本:Python 2.7.13 :: Anaconda 自定义(64 位) 熊猫版本:熊猫0.20.2

你好,

我有一个非常简单的要求。 我想读取一个 excel 文件并将一个特定的工作表写入一个 csv 文件。 写入 csv 文件时,应将源 Excel 文件中的空白值视为/写入空白。 但是,我的空白记录总是作为“nan”写入输出文件。 (不带引号)

我通过方法读取Excel文件

read_excel(xlsx, sheetname='sheet1', dtype = str)

我正在指定 dtype,因为我有一些列是数字,但应该被视为字符串。 (否则他们可能会丢失前导 0 等) 即我想从每个单元格中读取确切的值。

现在我通过以下方式编写输出 .csv 文件 to_csv(output_file,index=False,mode='wb',sep=',',encoding='utf-8')

但是,我的结果 csv 文件包含 nan 用于 excel 文件中的所有空白单元格。

我错过了什么?我已经尝试过 .fillna('', inplace=True) 函数,但它似乎对我的数据没有任何作用。 我也尝试将参数 na_rep ='' 添加到 to_csv 方法但没有成功。

感谢您的帮助!

附录:请在下文中找到可重现的示例。

请在下文中找到可重现的示例代码。 请先新建一个包含 2 列的 Excel 文件,内容如下: COLUMNA COLUMNB COLUMNC 01测试 02测试 03测试

(我将此 Excel 文件保存到 c:\test.xls 请注意,B 列的第 1 和第 3 行以及 C 列的第 2 行是空白/空)

现在这是我的代码:

import pandas as pd
xlsx = pd.ExcelFile('c:\\test.xlsx')
df = pd.read_excel(xlsx, sheetname='Sheet1', dtype = str)
df.fillna('', inplace=True)
df.to_csv('c:\\test.csv', index=False,mode='wb',sep=',',encoding='utf-8', na_rep ='')

我的结果是: COLUMNA,COLUMNB,COLUMNC 01,南,测试 02,测试,南 03,南,测试

我想要的结果是: COLUMNA,COLUMNB,COLUMNC 01,,测试 02,测试, 03,,测试

【问题讨论】:

“空白”是什么意思? df.fillna 没用? 请提供一个可重现的例子。 空白是指 Excel 中的一个空单元格(读取时)被写入 'nan'(不带引号) df.fillna('', inplace=True) 不起作用。我将尝试制作一个可重现的示例。 @panda 所以它是一个nan 字符串? 【参考方案1】:

由于您正在处理nan 字符串,您可以使用replace 函数:

df = pd.DataFrame('Col1' : ['nan', 'foo', 'bar', 'baz', 'nan', 'test'])
df.replace('nan', '')

   Col1
0      
1   foo
2   bar
3   baz
4      
5  test

所有'nan' 字符串值都将替换为空字符串''replace 不在位,因此请确保将其分配回去:

df = df.replace('nan', '')

然后您可以使用to_csv 将其写入您的文件。


如果您真的想用空白填充 NaN 值,请使用 fillna

df = df.fillna('')    

【讨论】:

非常感谢,这行得通!您能解释一下为什么 fillna() 不起作用吗? @panda df.fillna 显式查找np.nan(它是一个具有特殊位表示的浮点数),而'nan' 只是一个字符串。此外,如果有帮助,您可以考虑将此答案标记为已接受。谢谢! 谢谢。是否有任何特定原因/附加值 read_excel 将用“nan”字符串替换空白/空单元格而不是将它们留空? @panda 稍微搜索了一下,我发现它显然是一个错误:***.com/questions/16157939/… 我不喜欢用 '' 替换 'nan' 的想法,因为这似乎无法区分合法的 'nan' 字符串和空单元格,但 df = pd.read_excel.fillna('') 效果很好,谢谢。【参考方案2】:

我遇到了同样的问题,并在 read_excel 中使用了选项 keep_default_na=False。 df = pd.read_excel(content, sheet_name=sheet, header=[0], keep_default_na=False)

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review

以上是关于Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas read_excel() 将 .xls 文件格式导入 python 时出现 CompDocError

请问在Pandas用read_excel函数读取数据

python pandas如何过滤剔除数据?

Python Pandas GroupBy

python学习-pandas

Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')