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_csv
Python 版本:Python 2.7.13 :: Anaconda 自定义(64 位)
Pandas 版本:pandas 0.20.2
您好,
我的要求很简单。
我想读取一个 excel 文件并将特定的 sheet 写入 csv 文件。
在写入 csv 文件时,源 Excel 文件中的空白值应被视为/写入空白。
但是,我的空白记录总是以 'nan' 的形式写入输出文件。 (不带引号)
我通过方法
读取了Excel文件
read_excel(xlsx, sheetname='sheet1', dtype = str)
我指定 dtype 是因为我有一些列是数字但应该被视为字符串。 (否则他们可能会丢失前导 0 等)
即我想从每个单元格中读取确切的值。
现在我通过
to_csv(output_file,index=False,mode='wb',sep=',',encoding='utf-8')
但是,我的结果 csv 文件包含 excel 文件中所有空白单元格的 nan。
我错过了什么?我已经尝试过 .fillna('', inplace=True) 函数,但它似乎对我的数据没有任何作用。
我还尝试将参数 na_rep ='' 添加到 to_csv 方法但没有成功。
感谢您的帮助!
附录:请在下文中找到一个可重现的示例。
请在下文中找到可重现的示例代码。
请先创建一个包含 2 列的新 Excel 文件,内容如下:
专栏 COLUMNB COLUMNC
01测试
02 测试
03 测试
(我把这个Excel文件保存到c:\test.xls
请注意,B 列的第一行和第三行以及 C 列的第二行是 blank/empty)
现在这是我的代码:
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,测试
由于您正在处理 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('')
我遇到了同样的问题并在 read_excel 中使用了选项 keep_default_na=False。
df = pd.read_excel(内容, sheet_name=sheet, header=[0], keep_default_na=False)
Python 版本:Python 2.7.13 :: Anaconda 自定义(64 位) Pandas 版本:pandas 0.20.2
您好,
我的要求很简单。 我想读取一个 excel 文件并将特定的 sheet 写入 csv 文件。 在写入 csv 文件时,源 Excel 文件中的空白值应被视为/写入空白。 但是,我的空白记录总是以 'nan' 的形式写入输出文件。 (不带引号)
我通过方法
读取了Excel文件read_excel(xlsx, sheetname='sheet1', dtype = str)
我指定 dtype 是因为我有一些列是数字但应该被视为字符串。 (否则他们可能会丢失前导 0 等) 即我想从每个单元格中读取确切的值。
现在我通过 to_csv(output_file,index=False,mode='wb',sep=',',encoding='utf-8')
但是,我的结果 csv 文件包含 excel 文件中所有空白单元格的 nan。
我错过了什么?我已经尝试过 .fillna('', inplace=True) 函数,但它似乎对我的数据没有任何作用。 我还尝试将参数 na_rep ='' 添加到 to_csv 方法但没有成功。
感谢您的帮助!
附录:请在下文中找到一个可重现的示例。
请在下文中找到可重现的示例代码。
请先创建一个包含 2 列的新 Excel 文件,内容如下:
专栏 COLUMNB COLUMNC
01测试
02 测试
03 测试
(我把这个Excel文件保存到c:\test.xls 请注意,B 列的第一行和第三行以及 C 列的第二行是 blank/empty)
现在这是我的代码:
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,测试
由于您正在处理 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('')
我遇到了同样的问题并在 read_excel 中使用了选项 keep_default_na=False。 df = pd.read_excel(内容, sheet_name=sheet, header=[0], keep_default_na=False)