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 相关文章推荐
pycharm 使用心得(七)一些实用功能介绍
Jun 06 Python
python实现在pickling的时候压缩的方法
Sep 25 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
python文件操作之目录遍历实例分析
May 20 Python
Python用模块pytz来转换时区
Aug 19 Python
Python控制多进程与多线程并发数总结
Oct 26 Python
使用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
Mar 23 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
很酷的python表白工具 你喜欢我吗
Apr 11 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Pytorch mask-rcnn 实现细节分享
Jun 24 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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
77A一级收信机修理记
2021/03/02 无线电
用Socket发送电子邮件(利用需要验证的SMTP服务器)
2006/10/09 PHP
令PHP初学者头疼十四条问题大总结
2008/11/12 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
Jquery中find与each方法用法实例
2015/02/04 Javascript
jQuery手动点击实现图片轮播特效
2020/04/20 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
基于Vue实现电商SKU组合算法问题
2019/05/29 Javascript
js实现验证码功能
2020/07/24 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
vue打包通过image-webpack-loader插件对图片压缩优化操作
2020/11/12 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
pyqt和pyside开发图形化界面
2014/01/22 Python
python实现定制交互式命令行的方法
2014/07/03 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
python定向爬取淘宝商品价格
2018/02/27 Python
解决tensorflow 释放图,删除变量问题
2020/06/23 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
详解html5 postMessage解决跨域通信的问题
2018/08/17 HTML / CSS
Canvas引入跨域的图片导致toDataURL()报错的问题的解决
2018/09/19 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
StubHub墨西哥:购买和出售您的门票
2016/09/17 全球购物
盛大笔试题
2016/11/05 面试题
售后专员岗位职责
2013/12/08 职场文书
校庆团日活动总结
2014/08/28 职场文书
干部作风建设个人剖析材料
2014/10/11 职场文书
2015年世界无车日活动总结
2015/03/23 职场文书
社区宣传标语口号
2015/12/26 职场文书
七年级作文之我的梦想
2019/10/16 职场文书