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实现人机对话
Nov 14 Python
如何使用VSCode愉快的写Python于调试配置步骤
Apr 06 Python
python删除本地夹里重复文件的方法
Nov 19 Python
python监控文件并且发送告警邮件
Jun 21 Python
Python tkinter label 更新方法
Oct 11 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
代码详解django中数据库设置
Jan 28 Python
python Pillow图像处理方法汇总
Oct 16 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
Jan 20 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
Feb 05 Python
Python连接Mysql进行增删改查的示例代码
Aug 03 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模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
解析数组非数字键名引号的必要性
2013/08/09 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
复选框全选与全不选操作实现思路
2013/08/18 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
jQuery实现下拉菜单(内容为时间)的实时更新及图表的随动更新的方法
2016/07/07 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
vue实现element表格里表头信息提示功能(推荐)
2019/11/20 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
2020/11/06 Javascript
微信小程序自定义底部弹出框动画
2020/11/18 Javascript
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
Python判断一个list中是否包含另一个list全部元素的方法分析
2018/12/24 Python
Python变量类型知识点总结
2019/02/18 Python
基于python中__add__函数的用法
2019/11/25 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python工程师必考的6个经典面试题
2020/06/28 Python
python os.rename实例用法详解
2020/12/06 Python
使用CSS3的appearance属性改变任何元素的浏览器默认风格
2012/12/24 HTML / CSS
免费获得微软MCSD证书赶快行动吧!
2012/11/13 HTML / CSS
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
家长评语和期望
2014/02/10 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
模具专业毕业推荐信
2014/03/08 职场文书
暑期社会实践证明书
2014/11/17 职场文书
员工离职通知函
2015/04/25 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python
SpringBoot+Vue+JWT的前后端分离登录认证详细步骤
2021/09/25 Java/Android
各国货币符号大全
2022/02/17 杂记