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的词法分析与语法分析
May 18 Python
Python中的二叉树查找算法模块使用指南
Jul 04 Python
使用Python压缩和解压缩zip文件的教程
May 06 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
Apr 23 Python
numpy 进行数组拼接,分别在行和列上合并的实例
May 08 Python
Python逐行读取文件中内容的简单方法
Feb 26 Python
python实现ssh及sftp功能(实例代码)
Mar 16 Python
python不到50行代码完成了多张excel合并的实现示例
May 28 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
深度学习小工程练习之垃圾分类详解
Apr 14 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 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
15种PHP Encoder的比较
2007/03/06 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
2014/11/28 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
js中有关IE版本检测
2012/01/04 Javascript
javascript是怎么继承的介绍
2012/01/05 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
jquery自定义下拉列表示例
2014/04/25 Javascript
js解决select下拉选不中问题
2014/10/14 Javascript
javascript结合ajax读取txt文件内容
2014/12/05 Javascript
js+ajax实现获取文件大小的方法
2015/12/08 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
Layui给数据表格动态添加一行并跳转到添加行所在页的方法
2018/08/20 Javascript
浅谈vue3中effect与computed的亲密关系
2019/10/10 Javascript
[03:52]显微镜下的DOTA2第三期——英雄在无聊的时候干什么
2014/06/20 DOTA
Python多线程学习资料
2012/12/19 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
python 实现UTC时间加减的方法
2018/12/31 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
秸秆管理实施方案
2014/03/15 职场文书
学习经验演讲稿
2014/05/10 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年收银工作总结
2014/11/13 职场文书
社区党支部公开承诺书
2015/04/29 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python