第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > Python数据处理分析神器pandas 处理csv数据文件(上)

Python数据处理分析神器pandas 处理csv数据文件(上)

时间:2022-04-10 11:50:29

相关推荐

Python数据处理分析神器pandas 处理csv数据文件(上)

发现许多小伙伴入门Python几个月,还是低效率做数据处理。这套课程以形象的示意图,精心安排的案例,循序渐进带你玩转数据处理分析神器——pandas,课程中还有分析案例噢,干货满满!

前言

csv 是常见的数据处理源,大部分软件都能读写 csv 文件。专栏计划将用2节内容讲述 pandas 读取 csv 数据中的知识点与常见问题。

上篇(本文):

编码

表头与筛选列

快速日期处理(快速合并年月日列为日期)

解决千分位符的问题

下篇:

追加写入(多文件追加合并大文件)

列类型指定以及查找错误类型的技巧(在一列中找出不能转换为数值的内容)

大文件分批加载(加载处理4g以上大文件)

案例1:编码

加载 csv 数据的方法是在 pandas 包顶层的方法,由于习惯在导入包是给予 pandas 一个别名 pd,因此加载方法是 pd.read_csv 。

加载或输出 csv 最常用的参数应该是 encoding :

第一个 cell 中,行2,生成一个 DataFrame

行4,使用 DataFrame.to_csv() 输出到 csv 文件

第一个参数为文件路径

参数 encoding 设置为 "gb2312"

参数 index=False ,让行索引不输出

第二个 cell 中,行2,使用 pd.read_csv() 加载文件数据

注意此时的 encoding 需要指定为输出是所使用的 encoding,否则会产生错误

当不指定 encoding 参数时,会使用系统默认的编码,大家要注意尽可能指定明确的编码,否则你的代码放到另外一台电脑可能就会报错

由于有些编码之间有包含关系,输入输出的编码不对应,也不一定产生错误。比如上面的例子,数据都是字母与数字,因此即使在加载时使用 utf8 编码,也能正确加载

编码 gb2312 能够被 excel 正确读取,如果你希望文件能被 excel 打开查看,应该使用此编码

你应该尽可能使用 utf8 编码,因为他能够根据内容安排较合理的空间

案例2:指定表头与使用列

有一些系统导出的 csv 文件,会在表头处打上一些没用标记

第1,2行都是没用的行

此时我们可以参数 header 来解决问题:

这参数与 pd.read_excel 一样的使用方式,这里不多讲解

我们可以使用 usecols 指定最终加载的列:

同样与 pd.read_excel 一致

案例3:麻烦的日期

csv 文件本质上是一个文本文档,他本身不能记录每列数据的类型,因此 pandas 加载时往往是做一定的推断。

注意:案例3 讲解的所有参数,都能在 read_excel 中使用

一般像文本或数字的列,pandas 都可以正常识别,但是最麻烦的可能是日期类型。

如下一份 csv 数据:

第一列在 Excel 中显示为日期

当我们正常使用 pandas 加载数据后:

可以看到,正常加载下,pandas 只会把第一列当作是文本类型

其他列都被推断为 int64 ,这是我们期望的

此时我们可以通过参数 parse_dates 解决问题:

parse_dates=["date"] ,告诉 pandas ,date 列作为日期类型解析

注意参数 parse_dates 必需传入一个 列表

有时候,系统会把年月日拆分到多列:

现在日期被拆分成3列

但是没有关系,一样可以通过 参数 parse_dates 解决问题:

parse_dates=[["年", "month", "day"]] ,注意3个列的名字在一个列表中,同时是最外面的列表的一个元素

现在3列被合并成1列,并且为正确的日期

下面我们来看看执行流程示意图:

step1:parse_dates 参数传入的列表,有一个元素,为 ["年", "month", "day"],通过这个列表找出数据中的3个列

step2:按参数的指定顺序,排列好3个列的顺序

step3:通过 pd.to_datetime() ,合并为一个日期

不过你可能会注意到,此时年名字会被简单地用下划线连接在一起。如果希望指定名字,只需要传入字典即可:

parse_dates={"date":["年", "month", "day"]} ,指定哪3列合并为一个日期,并且指定日期名字为 date

这里说一个通用规则,pandas 中凡是与列相关的参数,一般都可以接受字典,因为字典的 key 刚好可以表示每一列(列名不重复)

如果你希望合并的同时保留原数据列,则可以设置参数keep_date_col = True

如果有多个日期需要合并,肯定也是可以的:

数据有2组日期被拆分为多列(红框与绿框)

只需要在参数 parse_dates 传入2个 item 的字典,即可解决

但是,有一次一个奇葩的系统给你一个大惊喜:

月份 与 天,不只是数字,还混合了中文字

之前所用到的方法都没法解决这个问题

下面介绍一种可以一次定义,即可用在不同情况下的解决方式:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。