Pandas–“大熊猫”基础
Series
Series: pandas的长枪(数据表中的一列或一行,观测向量,一维数组…)
1 |
|
输出结果:
1 |
|
- np.random.randn() 正态分布相关。函数说明
Series⽀持过滤的原理就如同NumPy
1 |
|
输出结果如下:
1 |
|
我发现,逻辑表达式,获得的值就是True或者False。要先取得值,还是要X[y]的形式。
当然也支持广播Broadcasting
什么是broadcasting
,暂时我也不太清楚,看个栗子:
1 |
|
输出结果如下:
1 | 0 0.06096 |
以及Universal Function
numpy.frompyfunc(out,nin,nout) 返回的是一个函数,nin是输入的参数个数,nout是函数返回的对象的个数函数说明
在序列上就使用行标,而不是创建1个2列的数据表,能够轻松辨别哪是数据,哪是元数据
这句话的意思,我的理解是序列尽量是一列,不用去创建2列,这样子,使用index就能指定数据了
1 |
|
输出结果如下,可以看到,它是通过修改了index
值的样式,并没有创建2列。
1 |
|
虽然行是有顺序的,但是仍然能够通过行级的index来访问到数据:
(当然也不尽然像Ordered Dict,因为⾏索引甚⾄可以重复,不推荐重复的行索引不代表不能用)
1 |
|
可以看到,读取数据时,确实要采用X[y]的格式。这里X[[y]]是因为,它要读取两个数据,指定的是这两个数据的index
值,将index
值存放进list
中,然后读取。输出结果如下:
1 |
|
再比如:
1 |
|
输出结果:
1 |
|
逻辑表达式的输出结果,布尔型值。
从Key不重复的Ordered Dict或者从Dict来定义Series就不需要担心行索引重复:
1 |
|
输出结果:
1 |
|
通过上面的输出结果就知道了,输出结果是无序的,和输入顺序无关。
想让序列按你的排序⽅式保存?就算有缺失值都毫无问题
1 |
|
上面这样的输出就会按照list
中定义的顺序输出结果。
整个序列级别的元数据信息:name
当数据序列以及index本身有了名字,就可以更方便的进行后续的数据关联啦!
这里我感觉就是列名的作用。下面举例:
1 |
|
很显然,输出的结果都是None
,因为我们还没指定name
嘛!
1 |
|
输出结果:
1 |
|
“字典”?不是的,⾏index可以重复,尽管不推荐。
1 |
|
输出结果:
1 |
|
我们可以看出,Series[‘B’]输出了两个值,所以index值尽量不要重复呀!
DataFrame
DataFrame:pandas的战锤(数据表,⼆维数组)
Series的有序集合,就像R的DataFrame一样方便。
仔细想想,绝大部分的数据形式都可以表现为DataFrame。
从NumPy二维数组、从文件或者从数据库定义:数据虽好,勿忘列名
1 |
|
这里DataFrame中的columns
应该就是列名的意思。现在看print
的结果,是不是很舒服啊!Excel的样式嘛
等长的列数据保存在一个字典里(JSON):很不幸,字典key是无序的
1 |
|
输出结果可以发现,无序的!
1 | GDP capital nation |
PS:由于懒得截图放过来,这里没有了边框线。
从另一个DataFrame定义DataFrame:啊,强迫症犯了!
1 |
|
很明显,这里是利用DF2
定义DF21,还通过指定cloumns
改变了列名的顺序。
1 |
|
很明显,这里定义了columns
的顺序,还定义了index
的顺序。
1 |
|
从DataFrame中取出列?两种方法(与JavaScript完全一致!)
OMG,囧,我竟然都快忘了js语法了,现在想起了,但是对象的属性既可以obj.x
也可以obj[x]
。
‘.’的写法容易与其他预留关键字产生冲突
‘[ ]’的写法最安全。
从DataFrame中取出行?(至少)两种⽅法:
- 方法1和方法2:
1 |
|
输出结果:
1 |
|
- 方法3 像NumPy切片一样的终极招式:iloc :
1 |
|
输出结果,验证一下:
1 |
|
动态增加列列,但是无法用”.”的方式,只能用”[]”
举个栗子说明一下就明白了:
1 |
|
输出结果:
1 |
|
Index:行级索引
Index:pandas进⾏数据操纵的鬼牌(行级索引)
⾏级索引是:
元数据
可能由真实数据产生,因此可以视作数据
可以由多重索引也就是多个列组合而成
可以和列名进行交换,也可以进行堆叠和展开,达到Excel透视表效果
Index有四种…哦不,很多种写法,⼀些重要的索引类型包括:
pd.Index(普通)
Int64Index(数值型索引)
MultiIndex(多重索引,在数据操纵中更详细描述)
DatetimeIndex(以时间格式作为索引)
PeriodIndex (含周期的时间格式作为索引)
直接定义普通索引,长得就和普通的Series⼀样
1 |
|
输出结果:
1 |
|
可惜Immutable,牢记! 不可变!举例如下:此处挖坑啊。不明白……
1 |
|
输出结果如下:
1 |
|
扔进去一个含有多元组的List,就有了MultiIndex
可惜,如果这个List Comprehension改成小括号,就不对了。
1 |
|
输出结果:
1 |
|
对于Series来说,如果拥有了多重Index,数据,变形!
下列代码说明:
二重MultiIndex的Series可以unstack()成DataFrame
DataFrame可以stack成拥有⼆重MultiIndex的Series
1 |
|
输出结果:
1 | Row_1 Col_1 0 |
看到输出结果,好像明白了点,有点类似Excel汇总一样。不过,日后还得查点资料
二重MultiIndex的Series可以unstack()成DataFrame
1 |
|
DataFrame可以stack成拥有⼆重MultiIndex的Series
1 |
|
输出结果:
1 |
|
非平衡数据的例子:
1 |
|
输出结果:
1 |
|
1 |
|
输出结果:
1 |
|
DateTime标准库如此好⽤,你值得拥有
1 |
|
输出结果:
1 |
|
如果你不仅需要时间格式统一,时间频率也要统一的话
1 |
|
输出结果:
1 |
|
月级精度和日级精度如何转换?
有的公司统⼀以1号代表当月,有的公司统一以最后1天代表当⽉,转化起来很麻烦,可以asfreq
1 |
|
输出结果:
1 |
|
最后的最后,我要真正把两种频率的时间精度匹配上?
1 |
|
输出结果:
1 |
|
粗粒度数据+reindex
+ffill/bfill
1 |
|
关于索引,⽅便的操作有?
前⾯描述过了,索引有序,重复,但⼀定程度上⼜能通过key来访问,也就是说,某些集合操作都是可以⽀持的。
1 |
|
输出结果:
1 |
|
大熊猫世界来去自如:Pandas的I/O
老生常谈,从基础来看,我们仍然关心pandas对于与外部数据是如何交互的。
结构化数据输入输出
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中的数据。
1 |
|
全部参数的请移步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
Excel … ?
对于存储着极为规整数据的Excel而言,其实是没必要一定用Excel来存,尽管Pandas也十分友好的提供了I/O接口。
1 |
|
注意:当你的xls文件行数很多超过65536时,就会遇到错误,解决办法是将写入的格式变为xlsx
。excel函数受限制问题
唯一重要的参数:sheetname=k,标志着一个excel的第k个sheet页将会被取出。(从0开始)
半结构化数据
JSON:网络传输中常⽤的⼀种数据格式。
仔细看一下,实际上这就是我们平时收集到异源数据的风格是一致的:
列名不能完全匹配
key可能并不唯一
元数据被保存在数据里
1 |
|
输出结果:
深入Pandas数据操纵
在前面部分的基础上,数据会有更多种操纵方式:
通过列名、行index来取数据,结合ix、iloc灵活的获取数据的一个子集(第一部分已经介绍)
按记录拼接(就像Union All)或者关联(join)
方便的统计函数与⾃定义函数映射
排序
缺失值处理
与Excel一样灵活的数据透视表(在第四部分更详细介绍)
数据集整合
横向拼接:直接DataFrame
1 |
|
横向拼接:Concatenate
1 |
|
输出结果
纵向拼接:Merge
根据数据列关联,使用on关键字
可以指定一列或多列
可以使⽤left_on和right_on
1 |
|
根据index关联,可以直接使用left_index和right_index
TIPS: 增加how关键字,并指定
how = ‘inner’
how = ‘left’
how = ‘right’
how = ‘outer’
结合how,可以看到merge基本再现了SQL应有的功能,并保持代码整洁
自定义函数映射
1 |
|
map: 以相同规则将1列数据作1个映射,也就是进行相同函数的处理
1 |
|
排序
sort: 按⼀列或者多列的值进行行级排序
sort_index: 根据index⾥的取值进行排序,而且可以根据axis决定是重排行还是列
sort
1 |
|
1 |
|
ascending
是降序的意思。
sort_index
1 |
|
一个好用的功能:Rank
1 |
|
缺失数据处理
忽略缺失值:
1 |
|
不忽略缺失值的话,估计就不能计算均值了吧。
如果不想忽略缺失值的话,就需要祭出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个函数
参考:
- S1EP3_Pandas.pdf 不知道什么时候存到电脑里的资料,今天发现了它。感谢作者的资料。