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 open读写文件实现脚本
Sep 06 Python
python连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
python实现文件分组复制到不同目录的例子
Jun 04 Python
Python之Scrapy爬虫框架安装及简单使用详解
Dec 22 Python
Python中defaultdict与lambda表达式用法实例小结
Apr 09 Python
python使用百度文字识别功能方法详解
Jul 23 Python
Django model 中设置联合约束和联合索引的方法
Aug 06 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
python使用pywinauto驱动微信客户端实现公众号爬虫
May 19 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 Python
Python爬虫入门案例之爬取二手房源数据
Oct 16 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
php 操作调试的方法
2012/07/12 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
JS 进度条效果实现代码整理
2011/05/21 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
关于IE BUG与字符串截取substr的解决办法
2013/04/10 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
jquery trigger函数执行两次的解决方法
2016/02/29 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
2020/12/04 Vue.js
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
用python 批量更改图像尺寸到统一大小的方法
2018/03/31 Python
Python实现随机漫步功能
2018/07/09 Python
python RabbitMQ 使用详细介绍(小结)
2018/11/08 Python
Python通过paramiko远程下载Linux服务器上的文件实例
2018/12/27 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
pandas-resample按时间聚合实例
2019/12/27 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
numpy库reshape用法详解
2020/04/19 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
css3个性化字体_动力节点Java学院整理
2017/07/12 HTML / CSS
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
数据管理员的自我评价分享
2013/11/15 职场文书
2015年幼儿园学期工作总结
2015/05/22 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
Nginx解决403 forbidden的完整步骤
2021/04/01 Servers
tomcat下部署jenkins的方法
2022/05/06 Servers