python纵向数据分析_Python数据分析入门之pandas总结基础(二)

一.大熊猫世界来去自如: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

6d9475f6jw1ez9lm7fzejj20em09pq4t.jpg

6d9475f6jw1ez9lmxnonvj20ix0a3jtj.jpg

全部参数的请移步API:

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

读取处理:

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时,就会遇到错误,解决办法是将写入的格式变为xlsx。excel函数受限制问题

唯一重要的参数: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

输出结果:

6d9475f6jw1ez9mm97wqqj20if07egn7.jpg

二. 深入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])

输出结果

6d9475f6jw1ez9mxf9uulj20he09pwg0.jpg

2.1.3 纵向拼接:Merge

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

可以指定一列或多列

可以使⽤left_on和right_on

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

6d9475f6jw1ez9mzcvkabj20g104dt9s.jpg

6d9475f6jw1ez9n2n6czpj20g904ejs9.jpg

根据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

6d9475f6jw1ez9nnizyfkj20lq05d0tu.jpg

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

6d9475f6jw1ez9ns3fprvj20dy03ljs3.jpg

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

6d9475f6jw1ez9o299de1j20nd05bgmp.jpg

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

6d9475f6jw1ez9o3xykzej20dj04et98.jpg

ascending是降序的意思。

2.3.2 sort_index

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

6d9475f6jw1ez9o77u4oej20de04jt97.jpg

2.3.3 一个好用的功能:Rank

DF33.rank()

6d9475f6jw1ez9oa7xelij20dx04k0sy.jpg

2.4 缺失数据处理

6d9475f6jw1ez9oh1x2a8j20d209n3zp.jpg

2.4.1 忽略缺失值:

DF34.mean(skipna=True)

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

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

6d9475f6jw1ez9ojdw89tj20f70dtwg4.jpg

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

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

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

Split-Apply-Combine

Split,就是按照规则分组

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

Combine,把结果收集起来

Pandas的groupby的灵活性:

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

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

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

6d9475f6jw1ez9oqvhpvoj20lz0jggqk.jpg

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

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

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

参考:

S1EP3_Pandas.pdf 不知道什么时候存到电脑里的资料,今天发现了它。感谢作者的资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值