8

一.大熊猫世界来去自如:Pandas的I/O

老生常谈,从基础来看,我们仍然关心pandas对于与外部数据是如何交互的。

1.1 结构化数据输入输出

  • read_csv与to_csv 是⼀对输⼊输出的⼯具,read_csv直接返回pandas.DataFrame,⽽to_csv只要执行命令即可写文件

    • read_table:功能类似

    • read_fwf:操作fixed width file

  • read_excel与to_excel方便的与excel交互

  • header 表⽰数据中是否存在列名,如果在第0行就写就写0,并且开始读数据时跳过相应的行数,不存在可以写none

  • names 表示要用给定的列名来作为最终的列名

  • encoding 表⽰数据集的字符编码,通常而言一份数据为了⽅便的进⾏⽂件传输都以utf-8作为标准

这里用的是自己的一个csv数据,因为找不到参考的这个pdf中的数据。


cnames=['经度','纬度']

taxidata2 = pd.read_csv('20140401.csv',header = 4,names=cnames,encoding='utf-8')

taxidata2

header=0

header=4

全部参数的请移步API:

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html#pandas.read_csv

这里介绍一些常用的参数:

读取处理:

  • skiprows:跳过⼀定的⾏数

  • nrows:仅读取⼀定的⾏数

  • skipfooter:尾部有固定的⾏数永不读取

  • skip_blank_lines:空⾏跳过

内容处理:

  • sep/delimiter:分隔符很重要,常⻅的有逗号,空格和Tab('\t')

  • na_values:指定应该被当作na_values的数值

  • thousands:处理数值类型时,每千位分隔符并不统⼀ (1.234.567,89或者1,234,567.89都可能),此时要把字符串转化为

数字需要指明千位分隔符

收尾处理:

  • index_col:将真实的某列(列的数⺫,甚⾄列名)当作index

  • squeeze:仅读到⼀列时,不再保存为pandas.DataFrame⽽是pandas.Series

1.2 Excel ... ?

对于存储着极为规整数据的Excel而言,其实是没必要一定用Excel来存,尽管Pandas也十分友好的提供了I/O接口。


taxidata.to_excel('t0401.xlsx',encoding='utf-8')

taxidata_from_excel = pd.read_excel('t0401.xlsx',header=0, encoding='utf-8')

taxidata_from_excel

注意:当你的xls文件行数很多超过65536时,就会遇到错误,解决办法是将写入的格式变为xlsxexcel函数受限制问题

唯一重要的参数:sheetname=k,标志着一个excel的第k个sheet页将会被取出。(从0开始)

1.3 半结构化数据

JSON:网络传输中常⽤的⼀种数据格式。

仔细看一下,实际上这就是我们平时收集到异源数据的风格是一致的:

  • 列名不能完全匹配

  • key可能并不唯一

  • 元数据被保存在数据里


import json

json_data = [{'name':'Wang','sal':50000,'job':'VP'},\

 {'name':'Zhang','job':'Manager','report':'VP'},\

 {'name':'Li','sal':5000,'report':'IT'}]

data_employee = pd.read_json(json.dumps(json_data))

data_employee_ri = data_employee.reindex(columns=['name','job','sal','report'])

data_employee_ri

输出结果:

二. 深入Pandas数据操纵

在前面部分的基础上,数据会有更多种操纵方式:

  • 通过列名、行index来取数据,结合ix、iloc灵活的获取数据的一个子集(第一部分已经介绍)

  • 按记录拼接(就像Union All)或者关联(join)

  • 方便的统计函数与⾃定义函数映射

  • 排序

  • 缺失值处理

  • 与Excel一样灵活的数据透视表(在第四部分更详细介绍)

2.1 数据集整合

2.1.1 横向拼接:直接DataFrame


pd.DataFrame([np.random.rand(2),np.random.rand(2),np.random.rand(2)],columns=['C1','C2'])

2.1.2 横向拼接:Concatenate


pd.concat([data_employee_ri,data_employee_ri,data_employee_ri])

输出结果

2.1.3 纵向拼接:Merge

根据数据列关联,使用on关键字

  • 可以指定一列或多列

  • 可以使⽤left_on和right_on


pd.merge(data_employee_ri,data_employee_ri,on='name')

根据index关联,可以直接使用left_index和right_index

TIPS: 增加how关键字,并指定

  • how = 'inner'

  • how = 'left'

  • how = 'right'

  • how = 'outer'

结合how,可以看到merge基本再现了SQL应有的功能,并保持代码整洁

2.2 自定义函数映射


dataNumPy32 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)])

DF32 = pd.DataFrame(dataNumPy32,columns=['nation','capital','GDP'])

DF32

2.2.1 map: 以相同规则将1列数据作1个映射,也就是进行相同函数的处理


def GDP_Factorize(v):

    fv = np.float64(v)

    if fv > 6000.0:

         return 'High'

    elif fv < 2000.0:

         return 'Low'

    else:

         return 'Medium'



DF32['GDP_Level'] = DF32['GDP'].map(GDP_Factorize)

DF32['NATION'] = DF32.nation.map(str.upper)

DF32

map

2.3 排序

  • sort: 按⼀列或者多列的值进行行级排序

  • sort_index: 根据index⾥的取值进行排序,而且可以根据axis决定是重排行还是列

2.3.1 sort


dataNumPy33 = np.asarray([('Japan','Tokyo',4000),('S.Korea','Seoul',1300),('China','Beijing',9100)])

DF33 = pd.DataFrame(dataNumPy33,columns=['nation','capital','GDP'])

DF33


DF33.sort(['capital','nation'],ascending=False)

ascending是降序的意思。

2.3.2 sort_index


DF33.sort_index(axis=1,ascending=True)

2.3.3 一个好用的功能:Rank


DF33.rank()

2.4 缺失数据处理

2.4.1 忽略缺失值:


DF34.mean(skipna=True)

不忽略缺失值的话,估计就不能计算均值了吧。

如果不想忽略缺失值的话,就需要祭出fillna了:

注:这里我在猜想,axis=1是不是就代表从的角度呢?还是得多读书查资料呀。

三. “一组”大熊猫:Pandas的groupby

groupby的功能类似SQL的group by关键字:

Split-Apply-Combine

  • Split,就是按照规则分组

  • Apply,通过⼀定的agg函数来获得输⼊pd.Series返回⼀个值的效果

  • Combine,把结果收集起来

Pandas的groupby的灵活性:

  • 分组的关键字可以来⾃于index,也可以来⾃于真实的列数据

  • 分组规则可以通过⼀列或者多列

没有具体数据,截图看一下吧,方便日后回忆。

分组可以快速实现MapReduce的逻辑

  • Map: 指定分组的列标签,不同的值就会被扔到不同的分组处理

  • Reduce: 输入多个值,返回1个值,一般可以通过agg实现,agg能接受1个函数

参考:

欢迎来Michael翔的博客查看完成版。


Michael翔
2.4k 声望219 粉丝