pandas入门

功能包括但不限于:

1.按轴自动或显式数据对齐功能的数据结构
2.集成时间序列功能
3.数学运算和约简
4.灵活处理缺失数据
5.常见数据库的关系型运算

引入约定:

In [1]: from pandas import Series, DataFrame
In [2]: import pandas as pd

pandas的数据结构介绍

Series和DataFrame

Series

obj=Series([4,7,-5,3])
obj

0    4
1    7
2    5
3  -4
dtype: int64

左边是索引,右边是值,分别由obj.index和obj.values获取

obj2 = Series([4,7,5,-4],index=['d','a','c','b']) #这里我们自定义索引值

可以通过索引的方式选取\添加和改变Series中的单个或一组值,用法跟字典类似

NumPy的数组运算(如根据布尔型数组进行过滤\标量乘法\应用数学函数等)都会保留索引和值之间的链接关系
obj2[obj>0]
obj2 * 2
np.exp(obj2)

可以将Series看成是一个定长的有序字典
'b' in obj2
True

如果数据存放在python字典中,也可以直接通过这个字典来创建Series
obj3 = Series(dic) 索引就是键
若存在另外一个列表list
obj4 = Series(dic, index=list) 如果list中的「索引」没有对应的值,会显示NaN
pandas的isnull和notnull函数可用于检测缺失数据

Series的一个重要功能:它在算术运算中会自动对齐不同索引的数据:
注意与NaN的算术运算总会返回NaN

Series对象及其索引都有一个name属性,该属性跟pandas其他关键功能关系非常密切
obj.name = 'abc'
obj.index,name = 'def'

Series的索引可以通过赋值的方式就地修改(不能多也不能少)
obj.index=list

DataFrame

一个表格型的数据结构,有行索引列索引,可以看做是由Series组成的字典(共用同一个索引)

最常用的构建DataFrame方法:直接传入一个由等长列表NumPy数组组成的字典

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}

frame = DataFrame(data)

frame
     pop  state  year
0  1.5    Ohio  2000
1  1.7    Ohio  2001
2  3.6    Ohio  2002
3  2.4  Nevada  2001
4  2.9  Nevada  2002

可以用columnsindex指定列索引和行索引,若传入的列在数据中找不到,就会产生NaN值,行不能多或少否则报错

通过类似字典标记的方式,可以获取将DataFrame的列获取为一个Series
frame2['year']
注意返回的Series拥有相同索引,且name属性也已被相应设置好

行可以通过索引字段ix获取
frame2.ix['two']

列可以通过赋值的方式进行修改;
将列表或数组赋值给某个列时,长度必须与DataFrame长度匹配;
如赋值的是一个Series,就会精确匹配到DataFrame的索引,空位将天上缺失值(注意这个Series需要加索引值)
为不存在的列赋值会创建一个新列;
关键字del用于删除列
del frame2['year'] 必须是中括号不能是frame2.year

通过索引方式返回的是相应数据的视图不是副本,因此对返回Series所做的修改会反映到源DataFrame上;通过Series的copy方法可显式的复制列

另一种常见的数据形式是嵌套字典
pop={'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
frame3 = DataFrame(pop)
外层字典的键作为列\内层键作为索引
内层键会被合并\排序形成最终的索引,可以指定索引
frame3 = DataFrame(pop, index = [2001, 2002, 2003])

表5-1列出了DataFrame所能接受的各种数据

可以给DataFrame的index和columns设置name属性,这些信息就会显示出来

values属性会以二位ndarray的形式返回DataFrame中的数据

索引对象

pandas的索引对象负责管理轴标签和其他元数据(比如轴名称)

Index对象不可修改(immutable),这样才能使Index对象在多个数据结构之间安全共享

表5-2 pandas中主要的Index对象

表5-3 Index的方法和属性

基本功能

介绍操作Series和DataFrame的基本手段

重新索引

reindex\作用是创建一个适应新索引的新对象
obj=Series([4.5,7.2,-5.3,3.6],index=['d','b','a','c'])
obj2 = obj.reindex(['a', 'b', 'c', 'd', 'e'], fill_value=0) 这里如果不填写就会引入NaN

reindex的(插值)method选项
ffill或pad\前向填充或搬运值
bfill或backfill\向后填充或搬运值
obj3.reindex(range(6),method='ffill')
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow
dtype: object

丢弃指定轴上的项

drop()相应的columns或index,注意是多个的话用列表形式

索引\选取和过滤

Series索引的工作方式类似于NumPy,只不过索引值不只是整数
obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj
a 0.0
b 1.0
c 2.0
d 3.0
obj['b']\1.0
obj[1]\1.0
obj[2:4]
c 2
d 3
obj[['b', 'a', 'd']]
b 1
a 0
d 3
obj[obj < 2]
a 0
b 1
利用标签的切片运算与普通的python切片运算不同,其末端是包含(inclusive)的(封闭区间)
obj['b':'c']
b 1
c 2

引入字段ix对DataFrame的行上进行标签索引
data=DataFrame(np.arange(16).reshape((4,4)),index=['Ohio','Colorado','Utah','New York'],columns=['one','two','three','four'])
data.ix['Colorado', ['two', 'three']]

表5-6 DataFrame的索引选项

算术运算和数据对齐

注意对应关系以及和NaN运算结果始终为NaN

在算术方法中填充值

灵活的算术方法
add(+)
sub(-)
div(/)
mul(*)
使用类似方法可以传入fill_value参数替代缺失值

DataFrame和Series之间的运算

广播(第十二章详解)

函数应用和映射

NumPy的ufuncs(元素级数组方法)也可以用于pandas对象

另一个常见操作是,将函数应用到由各列或行所形成的一维数组上\
DataFrame的apply方法即可实现此功能
frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])
f=lambdax:x.max()-x.min()
frame.apply(f) #默认是列索引
frame.apply(f,axis=1) #这个是行索引
def f(x):
    return Series([x.min(),x.max()],index=['min','max'])
frame.apply(f)
              b                   d                e
min -2.216707 -1.101685 -0.717719
max  2.266630  1.664559  1.172415

此外,元素级的python函数也是可用的,假如你想得到frame中各个浮点值的格式化字符串,使用applymap
format=lambda x:'%.2f' % x
frame.applymap(format)
                    b      d      e
Utah    -2.22  1.66  -0.72
Ohio    0.30  1.21  -0.65
Texas    2.27  -1.10  1.17
Oregon  -0.49  0.38  -0.33
frame['e'].map(format) #对某一列操作函数
Utah      -0.72
Ohio      -0.65
Texas      1.17
Oregon    -0.33
Name: e, dtype: object

排序和排名

对于Series,使用sort_index方法,返回一个根据index排序的新对象
obj.order()按值对Series排序
任何缺失值会被排到末尾

对于DataFrame,可根据任意轴上的索引进行排序,给sort_index()传入axis=1即可,默认为对index排序
默认是升序排序,ascending=False为降序排序
sort_index(by='b') 或 sort_index(by=['b', 'c'])

排名rank()
排名时用于破坏平级关系的method选项
'average'\'min'\'max'\'first'

带有重复值的轴索引

若某个索引对应多个值返回Series,对应单个值返回一个标量值

汇总和计算描述统计

axis\约简的轴,DataFrame中行用0,列用1(默认为0)
skipna\排除缺失值,默认是True
level\如果轴是层次化索引的(即MultiIndex),则根据level分组约简

describe用于一次性产生多个汇总统计
df.describe()
表5-10列出了所有与描述统计相关的方法

相关系数与协方差

Series的corr方法用于计算两个Series中重叠的\非NA的\按索引对齐的值的相关系数
df.series1.corr(df.series2)

类似的用cov计算协方差

另外对于一个DataFrame对象的corr和cov方法将返回完整的相关系数或协方差矩阵

利用DataFrame的corrwith方法,可以计算其列或行跟另一个Series或DataFrame之间的相关系数;

传入一个Series将会返回一个相关系数值Series(针对各列进行计算)

传入一个DataFrame则会计算按列名配对的相关系数

唯一值\值计数以及成员资格

isin\计算一个表示'Series各值是否包含于传入的值的序列中'的布尔型数组
unique\计算Series中的唯一值数组,按发现的顺序返回
value_counts\返回一个Series,其索引为唯一值,其值为频率,按技术支持降序排列

data=DataFrame({'Qu1':[1,3,4,3,4],'Qu2':[2,3,1,2,3],'Qu3':[1,5,2,4,4]})
data
  Qu1  Qu2  Qu3
0    1    2    1
1    3    3    5
2    4    1    2
3    3    2    4
4    4    3    4
将pd.value_counts传给该DataFrame的apply函数
result = data.apply(pd.value_counts).fillna(0)
result
 Qu1  Qu2  Qu3
1  1.0  1.0  1.0
2  0.0  2.0  1.0
3  2.0  2.0  0.0
4  2.0  0.0  2.0
5  0.0  0.0  1.0

处理缺失数据

pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据;
python内置的None值也会当做NA处理

dropna\根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度
fillna\用指定值或插值方法填充缺失数据

滤除缺失数据

对于Series,dropna返回仅含非空数据和索引值的Series;也可以用notnull()布尔索引值方法达到相同结果

对于DataFrame,默认丢弃任何含有缺失值的行;
传入how='all',将只丢弃全为NA的行;
传入axis=1,将丢弃列

填充缺失数据

fillna()
传入常数\传入字典\也可以传入data.mean()平均数,中文数之类的
fillna默认返回新对象,传入inplace=True会覆盖源对象

层次化索引

它能使你在一个轴上拥有多个索引级别\能以低纬度形式处理高维度数据

重排分级顺序

swaplevel接受两个级别编号或名称,并返回一个互换级别的新对象(但数据不会发生变化)

根据级别汇总统计

level选项用于指定某条轴上求和的级别(利用了groupby功能)

使用DataFrame的列

将DataFrame的一个或多个列当做行索引来用,或者可能将行索引变成DataFrame的列.

set_index()\将列转换为行索引(传入columns的标签),默认会移除这些列,传入drop=False将其保留

reset_index刚好相反

其他有关pandas的话题

整数索引

面板数据

Panel数据结构,三维版的DataFrame

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容