Python pandas读取CSV文件的注意事项(适合新手)


Posted in Python onJune 20, 2021
目录
  • 前言
  • 示例文件
  • 文件编码
  • 空值
  • 日期错误
  • 函数映射
    • 方法1:直接使用labmda表达式
    • 方法二:使用自定义函数
    • 方法三:使用数值字典映射
  • 总结

 

前言

本文是给使用pandas的新手而写,主要列出一些常见的问题,根据笔者所踩过的坑,进行归纳总结,希望对读者有所帮助。

 

示例文件

将以下内容保存为文件 people.csv。

id,姓名,性别,出生日期,出生地,职业,爱好
1,张小三,m,1992-10-03,北京,工程师,足球
2,李云义,m,1995-02-12,上海,程序员,读书 下棋
3,周娟,女,1998-03-25,合肥,护士,音乐,跑步
4,赵盈盈,Female,2001-6-32,,学生,画画
5,郑强强,男,1991-03-05,南京(nanjing),律师,历史-政治

如果一切正常的话,在Jupyter Notebook 中应该显示以下内容:

Python pandas读取CSV文件的注意事项(适合新手)

 

文件编码

文件编码格式是最容易出错的问题之一。如果编码格式不正确,就会完全读取不出文件内容,出现类似于以下的错误, 让人完全不知所措:

---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-6-8659adefcfa6> in <module>
----> 1 pd.read_csv('people.csv', encoding='UTF-8')

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in parser_f(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
    683         )
    684
--> 685         return _read(filepath_or_buffer, kwds)
    686
    687     parser_f.__name__ = name

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
    455
    456     # Create the parser.
--> 457     parser = TextFileReader(fp_or_buf, **kwds)
    458
    459     if chunksize or iterator:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
    893             self.options["has_index_names"] = kwds["has_index_names"]
    894
--> 895         self._make_engine(self.engine)
    896
    897     def close(self):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
   1133     def _make_engine(self, engine="c"):
   1134         if engine == "c":
-> 1135             self._engine = CParserWrapper(self.f, **self.options)
   1136         else:
   1137             if engine == "python":

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
   1915         kwds["usecols"] = self.usecols
   1916
-> 1917         self._reader = parsers.TextReader(src, **kwds)
   1918         self.unnamed_cols = self._reader.unnamed_cols
   1919

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()

pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._get_header()

UnicodeDecodeError: 'UTF-8' codec can't decode byte 0x93 in position 2: illegal multibyte sequence

目前对于中文而言,最常使用的有 utf-8 和 UTF-8 两种格式,只需要指定正确的编码。在不知道编码的情况下,只需要尝试两次即可。padas默认的文件编码格式是 utf-8,所以如果出现以上错误,只需使用 encoding=UTF-8 再尝试一下即可,如 pd.read_csv(file, encoding='UTF-8')。

 

空值

空值是csv中也非常常见,比如以下内容:

import pandas as pd
df = pd.read_csv('people.csv')
v1=df['出生地'][3]
print(v1, type(v1))

输出为:

nan <class 'float'>

由此可见,空值也是有数据类型的,为 float 类型。

如何判断空值有两种方法,可以使用 math.isnan(x) 也可以使用 isinstance(float)。我们知道,DateFrame对象是包括Series对象,而在一个Series对象中,所有的数据类型默认是一样的,所以如果其数据类型推断为字符串(str),那么直接使用 math.isnan(x) 则会报错 TypeError: must be real number, not str 错误,即必需为实数,不能是字符串。所以,这时我们还需要使用 isinstance(x, flaot) 方法。
具体请看这个示例:

df.出生地=df.出生地.map(lambda x: '其他' if isinstance(x, float) else x)
df

Python pandas读取CSV文件的注意事项(适合新手)

 

日期错误

出生日期中,有的数据错误,如赵盈盈的出生日期是6月32号,所以报错了。对于这样类似的错误,我们可以使用函数判断的方式进行处理,具体如下。

首先,编写 isDate 函数用于判断日期是否合法。

def isDate(adate):
    try:
        sects = adate.split('-')
        year = int(sects[0])
        month = int(sects[1])
        day = int(sects[2])
        days = [0, 31, 29 if year % 4 == 0 else 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        return year > 0 and year < 9999 and month > 0 and month <= 12 and day > 0 and day <= days[month]
    except:
        return False

然后使用以下代码进行判断:

for id in df.index:
    if not isDate(df.loc[id, '出生日期']):
        print(df.loc[id, '出生日期'])
        df.loc[id, '出生日期'] = '2000-01-01'

输出结果如下,可见错误的日期被修改成了2020年1月1日。

2001-6-32
   id   姓名      性别        出生日期          出生地   职业     爱好 
0   1  张小三       m  1992-10-03           北京  工程师     足球  
1   2  李云义       m  1995-02-12           上海  程序员  读书 下棋  
2   3   周娟       女  1998-03-25           合肥   护士  音乐,跑步  
3   4  赵盈盈  Female  2000-01-01          NaN   学生     画画   
4   5  郑强强       男  1991-03-05  南京(nanjing)   律师  历史-政治  

 

函数映射

 

方法1:直接使用labmda表达式

需要对数据列进行复杂操作的时候,我们可以使用以下函数时行相应的操作。

df=df.fillna('未知')
df.爱好=df.爱好.map(lambda x: x.split(' ')[0].split('-')[0].split(',')[0])
df

Python pandas读取CSV文件的注意事项(适合新手)

 

方法二:使用自定义函数

在进行映射时,如果操作比较简单,可以使用字典的方式进行数值映射映射(参见下文)。但是如果操作比较复杂,则需要使用函数进行映射。请看这个示例,读取到性别时,内容有 ‘m', ‘M', ‘Female' 等内容,现在需要其全部转换为 男 或 女:

def set_sex(s):
    if s.lower() == 'm' or s.lower() == 'male':
        return '男'
    elif s.lower() == 'female':
        return '女'        
    return s

df = pd.read_csv('people.csv', converters={'性别': lambda x : set_sex(x)})
df

Python pandas读取CSV文件的注意事项(适合新手)

 

方法三:使用数值字典映射

在数据处理时,数值型往往比字符串效率更高,所以在可能的情况下,我们希望将数据转换成字符串处理。请看这个示例,将输入的数据的性别中的男性转换为1 女性转换为0。操作如下:

Python pandas读取CSV文件的注意事项(适合新手)

 

总结

到此这篇关于Python pandas读取CSV文件注意事项的文章就介绍到这了,更多相关pandas读取CSV文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python文件操作相关知识点总结整理
Feb 22 Python
python WindowsError的错误代码详解
Jul 23 Python
python实现超市扫码仪计费
May 30 Python
python绘制热力图heatmap
Mar 23 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
Aug 27 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
Jun 03 Python
pytorch查看模型weight与grad方式
Jun 24 Python
Python虚拟环境的创建和使用详解
Sep 07 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 Python
python简单验证码识别的实现过程
Python pygame实现中国象棋单机版源码
Python并发编程实例教程之线程的玩法
Jun 20 #Python
python迷宫问题深度优先遍历实例
Jun 20 #Python
Python虚拟环境virtualenv是如何使用的
Python机器学习之底层实现KNN
Jun 20 #Python
利用python进行数据加载
Jun 20 #Python
You might like
一段防盗连的PHP代码
2006/12/06 PHP
PHP中include/require/include_once/require_once使用心得
2016/08/28 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
vue组件 $children,$refs,$parent的使用详解
2017/07/31 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
详解Nuxt.js Vue服务端渲染摸索
2018/02/08 Javascript
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
layui中table表头样式修改方法
2018/08/15 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
JavaScript实现简单的计算器
2020/01/16 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
python2.7+selenium2实现淘宝滑块自动认证功能
2018/02/24 Python
pandas DataFrame实现几列数据合并成为新的一列方法
2018/06/08 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python 实现字符串下标的输出功能
2020/02/13 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
最新个人职业生涯规划书
2014/01/22 职场文书
学生会离职感言
2014/02/11 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
《中彩那天》教学反思
2014/02/22 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
教师师德考核自我评价
2014/09/13 职场文书
委托证明范本
2014/11/25 职场文书
市场营销计划书
2019/04/24 职场文书