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() 不起作用吗? @pandadf.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
Python Pandas read_excel dtype str 在读取或通过 to_csv 写入时将 nan 替换为空白 ('')