Pandas 基础之1 Series和DataFrame

Pandas的两个主要数据结构:Series和DataFrame

Series

Series 是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series

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

Series 的字符串表现形式为:索引在左边,值在右边

可以通过Series的values和index属性获取其数组表示形式和索引对象:

obj.values

obj.index

通常,我们希望所创建的Series带有一个可以对各个数据点进行标记的索引:

obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])

与普通Numpy数组相比,可以通过索引的方式选取Series中的单个或一组值:

obj2['a']

还可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。它可用用在许多原本需要字典参数的函数中

'b' in obj2

如果数据被存放在一个Python字典中,也可以直接通过这个字典来创建Series:

sdata = {'Ohio':3500, 'Texas': 71000, 'Oregon':16000, 'Utah':5000}

obj3 = Series(sdata)

如果只传入一个字典,则结果Series中的索引就是原字典的键(有序排列)

states = ['California', 'Ohio', 'Oregon', 'Texas']

obj4 = Series(sdata, index=states)

pandas的isnull和notnull函数可用于检测缺失数据

Series也有类似实例方法:

obj4.isnull()

Series最重要的一个功能是:它在算术运算中会自动对齐不同索引的数据

Series对象本身及其索引都有一个name属性,该属性跟pandas其他的关键功能关系非常密切:

obj4.name = "population"

obj4.index.name = 'state'

Series的索引可以通过赋值的方式就地修改

obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']

DataFrame

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,可以被看作由Series组成的字典(共用同一个索引)。DataFrame中面向行和面向列的操作基本上是平衡的。

其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)

构建DataFrame的办法有很多,最常用的一种是直接传入一个由等长列表或Numpy数组组成的字典:

data = {'state':['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],

'year': [2000, 2008, 2009, 2010, 2019],

'pop':[1.5, 1.7, 2.5, 2.6, 3.9]}

frame = DataFrame(data)

DataFrame 会自动加上索引(跟Series一样),且全部列会被有序排列

通过类似字典标记的方式或属性的方式,可以将DataFrame 的列获取为一个Series

返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。行也可以通过位置或名称的方式进行获取

列可以通过赋值的方式进行修改

将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配。

为不存在的列赋值会创建出一个新列。

对返回的Series所做的任何就地修改全都会反映到源DataFrame上。通过Series的copy方法即可显式地复制列

另外一种常见的数据形式是嵌套字典(也就是字典的字典)

如果将它传给DataFrame,它就会被解释为:外层字典的键作为列,内层键则作为行索引

索引对象

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

构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index

Index对象是不可修改的(immutable),因此用户不能对其进行修改

不可修改性非常重要,因为这样才能使Index对象在多个数据结构之间安全共享

Index甚至可以被继承从而实现特别的轴索引功能

除了长得像数组,Index的功能也类似一个固定大小的集合

每个索引都有一些方法和属性,可用于设置逻辑并回答有关该索引所包含的数据的常见问题。

重新索引

pandas对象的一个重要方法是reindex,其作用是创建一个适应新索引的新对象。

对于时间序列这样的有序数据,重新索引时可能需要做一些插值处理。method选项即可达到此目的。

obj3.reindex(range(6), method='ffill')

对于DataFrame,reindex可以修改(行)索引、列,或两个都修改。

如果仅传入一个序列,则会重新索引行

利用ix的标签索引功能,重新索引任务可以变得更简洁

frame.ix[['a', 'b', 'c', 'd'], states]

丢弃指定轴上的项

丢弃某条轴上的一个或多个项很简单,只要有一个索引数组或列表即可。由于需要执行一些数据整理和集合逻辑,所以drop方法返回的是一个在指定轴上删除了指定值的新对象

索引、选取和过滤

Series索引(obj[...])的工作方式类似于Numpy数组的索引,只不过Series的索引值不只是整数。

利用标签的切片运算与普通的Python切片运算不同,其末端是包含的(inclusive)

对DataFrame进行索引其实就是获取一个或多个列

算术运算和数据对齐

pandas最重要的一个功能是,可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。

自动的数据对齐操作在不重叠的索引处引入了NA值。

对于DataFrame,对齐操作同时发生在行和列上。

在算术方法中填充值

在对不同索引的对象进行算术运算时,可能你希望当一个对象中某个轴标签在另一个对象中找不到时填充一个特殊值

默认情况下,DataFrame和Series之间的算术运算会将Series的索引匹配到DataFrame的列,然后沿着行一直向下广播(broadcasting)

函数应用和映射

将函数应用到由各列或行所形成的一维数组上。DataFrame的apply方法即可实现此功能

元素级的Python函数也是可用的。如果想得到frame中各个浮点值的格式化字符串,使用applymap即可

排序和排名

根据条件对数据集排序(sorting)也是一种重要的内置运算。要对行或列索引进行排序(按字典顺序),可使用sort_index方法,将返回一个已排序的新对象。

排名(ranking)跟排序关系密切,且它会增设一个排名值(从1开始,一直到数组中有效数据的数量)。

带有重复值的轴索引

索引的is_unique属性可以告诉你它的值是否是唯一的

对于带有重复值的索引,数据选取的行为将会有些不同。

汇总和计算描述统计

相关系数与协方差

Series的Corr方法用于计算两个Series中的重叠的、非NA的、按索引对齐的值的相关系数。

cov用于计算协方差

DataFrame的corr、cov方法将以DataFrame的形式返回完整的相关系数或协方差矩阵

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

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

第一个函数是unique,可以得到Series中的唯一值数组

value_counts用于计算一个Series中各个值出现的频率

value_counts还是一个顶级pandas方法,可用于任何数组或序列

pd.value_counts(obj.values, sort=False)

isin 用于判断矢量化集合的成员资格,可用于选取Series或DataFrame列中数据的子集

处理缺失数据

缺失数据(missing data) 在大部分数据分析应用中都很常见。

pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据。

Python内置的none也被当做NA处理

滤除缺失数据

对于一个Series,dropna返回一个仅含非空数据和索引值的Series

data.dropna()

也可以通过布尔型索引达到这个目的:

data[data.notnull()]

对于DataFrame对象,dropna默认丢弃任何含有缺失值的行

传入how='all'将只丢弃全为NA的那些行

要用那种方式丢弃列,只需传入axis=1即可:

data.dropna(axis=1, how='all')

填充缺失数据

对于大多数情况而言,fillna方法是最主要的函数

fillna默认会返回新对象

使用inplace=True对现有对象进行就地修改

df.fillna(0, inplace=True)

对reindex有效的那些插值方法也可用于fillna

层次化索引

层次化索引(heirarchical indexing)是pandas的一项重要功能,它使你能在一个轴上拥有多个(两个以上)索引级别。它使你能以低纬度形式处理高维度数据。

对于一个DataFrame,每条轴都可以有分层索引

重排分级顺序

有时需要重新调整某条轴上各级别的顺序,或根据指定级别上的值对数据进行排序。swaplevel接受两个级别编号或名称,并返回一个互换了级别的新对象(但数据不会发生变化)

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

推荐阅读更多精彩内容