pandas.read_excel()na_values无法正常工作

nvbavucw  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(128)

如标题所述,在reviewing docs之后
我正在阅读一个.xlsx文件,其中一列“HOUR”有许多值,当示例的值为99时,我希望转换为“无”
我已经尝试了不同值的na_values参数:

na_values = ['99'] 
na_values = [r'99']
na_values = 99
...

然后这样读取excel:

accidents = pd.read_excel(filename, sheet_name= 'datos', na_values=[99])

但好像不管用

np.sum(accidents['HOUR'] == 99)

我得到一个大于0的值(这意味着值= 99的示例尚未转换为None/NaN)
我还读到,我应该包括选项

keep_default_na=False

但毫无结果。
“HOUR”列的值为:

accidents['HOUR'].unique()
array([ 8, 15,  9, 14, 11,  0, 13, 20,  3, 19, 17,  7, 22, 21, 16,  6, 23,
   18, 10, 12,  1, 99,  4,  5,  2, 24], dtype=int64)

我已经把我的Pandas版本升级到1.5.1了,但还是不行,你知道为什么吗?
.xls文件位于:http://www.transtats.bts.gov/Fields.asp?Table_ID=1158
谢谢你

rbpvctlc

rbpvctlc1#

阅读excel文件后,只需在 Dataframe 上应用replace方法:

df.replace(99, np.nan)

如果只想替换特定列(如“小时”)的值:

df['HOUR'].replace(99, np.nan)

更新日期:

我想您想知道为什么read_excel()方法不能使用您提供的na值,如果您查看该方法的文档:

na_值:标量、字符串、类似列表或dict,默认值为None要识别为NA/NaN的其他字符串。

它只接受na_values参数中的字符串,因此您需要将其作为字符串'99'传递,以便在您的情况下工作。
由于某些原因,它不适用于Excel工作表中的integer na_values。根据文档read_excel方法,列类型是推断的,但可以显式指定。也许它没有正确设置HOUR列类型,因此na_values不工作。我找到了一个解决办法,在方法中显式指定列数据类型,它工作得很好:

accidents = pd.read_excel(filename, sheet_name= 'datos', dtype={'HOUR': str}, na_values=['99'])

accidents = pd.read_excel(filename, sheet_name= 'datos', dtype={'HOUR': str}, na_values=[99])
2sbarzqh

2sbarzqh2#

好吧,最新消息。
我仍然没有弄清楚为什么read_excel()函数不能按预期工作
如果有人有这个问题,我建议将.xls/.xlsx文件转换为.csv,并像这样更改读取函数:

accidents = pd.read_excel(filename, sheet = 0, na_values = missing_values_dict, keep_default_na=False)

accidents = pd.read_csv(filename , sep = ';', na_values= missing_values_dict, keep_default_na=False)

使用missing_values_dict执行以下操作:

missing_values_dict = {
  'WEEKDAY': '9',
  'HOUR': '99'
}

有任何问题请告诉我!

相关问题