发现许多小伙伴入门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 的字典,即可解决
但是,有一次一个奇葩的系统给你一个大惊喜:
月份 与 天,不只是数字,还混合了中文字
之前所用到的方法都没法解决这个问题
下面介绍一种可以一次定义,即可用在不同情况下的解决方式: