使用Python pandas读取CSV文件应该注意什么?
作者:郝伟博士 发布时间:2022-06-26 16:05:50
示例文件
将以下内容保存为文件 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 中应该显示以下内容:
文件编码
文件编码格式是最容易出错的问题之一。如果编码格式不正确,就会完全读取不出文件内容,出现类似于以下的错误, 让人完全不知所措:
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
<ipython-input-6-8659adefcfa6> in <module>
----> 1 pd.read_csv('people.csv', encoding='gb2312')
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: 'gb2312' codec can't decode byte 0x93 in position 2: illegal multibyte sequence
目前对于中文而言,最常使用的有 utf-8
和 gb2312
两种格式,只需要指定正确的编码。在不知道编码的情况下,只需要尝试两次即可。padas默认的文件编码格式是 utf-8
,所以如果出现以上错误,只需使用 encoding=gb2312
再尝试一下即可,如 pd.read_csv(file, encoding='gb2312')
。
空值
空值是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
函数映射
方法1:直接使用labmda表达式
需要对数据列进行复杂操作的时候,我们可以使用以下函数时行相应的操作。
df=df.fillna('未知')
df.爱好=df.爱好.map(lambda x: x.split(' ')[0].split('-')[0].split(',')[0])
df
方法二:使用自定义函数
在进行映射时,如果操作比较简单,可以使用字典的方式进行数值映射映射(参见下文)。但是如果操作比较复杂,则需要使用函数进行映射。请看这个示例,读取到性别时,内容有 ‘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
方法三:使用数值字典映射
在数据处理时,数值型往往比字符串效率更高,所以在可能的情况下,我们希望将数据转换成字符串处理。请看这个示例,将输入的数据的性别中的男性转换为1 女性转换为0。操作如下:
来源:https://blog.csdn.net/weixin_43145361/article/details/117909213


猜你喜欢
- 斜角导航条看上去立体感比较强,但实现起来比较麻烦;这是前几天写的一个测试代码,实现时,本来想用简单的图片加负数来实现;但GIF图片对半透明的
- 所谓线性最小二乘法,可以理解为是解方程的延续,区别在于,当未知量远小于方程数的时候,将得到一个无解的问题。最小二乘法的实质,是保证误差最小的
- 本文实例讲述了php防止sql注入中过滤分页参数的方法。分享给大家供大家参考。具体分析如下:就网络安全而言,在网络上不要相信任何输入信息,对
- 上次亚马逊的商品信息都获取到了,自然要看一下评论的部分。用户的评论能直观的反映当前商品值不值得购买,亚马逊的评分信息也能获取到做一个评分的权
- pygame鼠标进行拖拽移动图片、缩放、以及按钮响应 案例# -*- coding: UTF-8 -*-#!/usr/bin/env pyt
- 1. 避免将多个类放在一个文件里面。 2. 一个文件应该只有一个命名空间,避免将多个
- javaScript 代码如下:$(document).ready(function(){ $(".message_list .m
- 换用非默认浏览器时需要输入密码或token查询方法:在XX:\AnacondaXX\Scripts下 运行jupyter-notebook.
- Profile 和 cProfile在 Python 标准库里面有两个模块可以用来做性能测试。1. 一个是 Profile,它是一个纯 Py
- 在空白的文本编辑器里打开一个崭新的文本,没有一行代码,出现在眼前的是一个充满了无限可能和希望的项目。可是,当数千行的代码写完之后,整个项目因
- 1、引言小鱼:小 * 丝,走啊,出去撸串啊,小 * 丝:没时间啊,鱼哥小鱼:嗯??? 啥事情让你忙的撸串都不去了小 * 丝:我的BOSS让我写一个自动化
- 首先得抛出个重要的前提观点,大屏幕、宽屏幕根本不是为方便“扫视”准备的。所以说以内容为基础的网站设计不用考虑超宽、超大的场景,甚至包括服务类
- 我们知道,微信公众号开发分订阅号和服务号,而个人只能申请订阅号,订阅号不能设置菜单,无形中只能通过关键字回复实现,比如我回复帮助,就返回帮助
- 前言:open()函数的定义:def open(file, mode='r', buffering=None, encodi
- 前言不管是做开发还是做过网站的朋友们,应该对于User Agent一点都不陌生,User Agent 中文名为用户代理,简称 UA,它是一个
- 安装过程询问一般 y 就可以了1 安装1.1 下载wget https://dev.mysql.com/get/mysql-apt-conf
- 本文实例为大家分享了js调用设备摄像头的具体代码,供大家参考,具体内容如下使用getUserMedia这个API来获取摄像头的权限 兼容ch
- 项目功能地图编辑器:可以实现玩家自己定义每一关卡的样式和难易程度运行界面:实现了玩家的移动,跳跃,发射 * ,投掷 * ,以及敌人的AL(移动,
- 游标(Cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次以行或者多行前进或向后浏览数据的能力。我们
- VueConf ,尤大说, Vue 支持 Ts 了,网上关于 Vue + Ts 的资料有点少, 楼主踩了一个星期坑,终于摸明白了 修饰器 的