笔记|数据分析之pandas基础----数据结构Series与DataFrame

pandas

在pandas中接下来要经常用到的数据结构就是Series和DataFrame了。这两个对象为大多数数据处理提供了可靠、易于使用的功能

Series

Series是由一组数据以及这组数据所对应的数据标签(即索引)组成。

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

In [67]: obj
Out[67]:
0    4
1    7
2   -5
3    3
dtype: int64

其中左边的一列数字即为索引,索引默认是0到N-1的数字。

自定义索引

我们可以通过设置index属性来自定义索引的表现形式。

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

In [69]: obj2
Out[69]:
d    4
b    7
a   -5
c    3
dtype: int64
Series索引的应用
In [70]: obj2['a']
Out[70]: -5

In [71]: obj2['d'] = 6

In [72]: obj2
Out[72]:
d    6
b    7
a   -5
c    3
dtype: int64

In [74]: obj2[['a','b','c']]
Out[74]:
a   -5
b    7
c    3
dtype: int64

In [79]: obj2[['a','b','c']] = 1

In [80]: obj2
Out[80]:
d    6
b    1
a    1
c    1
dtype: int64

我们可以通过直接索引的方式来取出一个值或者一组值,也可以像NumPy一样可以对它们进行赋值。

Series的运算
In [83]: obj2[obj2 > 0]
Out[83]:
d    4
b    7
c    3
dtype: int64
In [84]: obj2 * 2
Out[84]:
d     8
b    14
a   -10
c     6
dtype: int64

NumPy的运算函数也支持Series对象

In [85]: np.exp(obj2)
Out[85]:
d      54.598150
b    1096.633158
a       0.006738
c      20.085537
dtype: float64
Series和Python字典的关系
In [88]: sdata = {'Ohio': 35000, 'Texas':71000, 'Oregon':16000, 'Utah':5000}

In [89]: obj3 = Series(sdata)

In [90]: 
Out[90]:
Ohio      35000
Texas     71000
Oregon    16000
Utah       5000
dtype: int64

如果单单传入一个字典,那么最终得到的Series对象中的索引值就是字典的键值。

In [91]: states = ['California', 'Ohio', 'Oregon','Texas']
In [92]: obj4 = Series(sdata, index=states)

In [93]: obj4
Out[93]:
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64

在上面这个替换索引的例子中,sdata中的键值(索引)与states中相匹配的三个值会被找出来作了替换,但是California这个索引在sdata中不存在,所以它的结果为NaN。在pandas中,NaN表示缺失数据。

如果传入多个字典,那结果会和上面的例子截然相反

In [94]: sdata2 = {'Ohios': 35000, 'Texass':71000, 'Oregons':16000, 'Utahs':5000}

In [95]: obj3 = Series([sdata,sdata2])

In [96]: obj3
Out[96]:
0    {'Ohio': 35000, 'Texas': 71000, 'Oregon': 1600...
1    {'Ohios': 35000, 'Texass': 71000, 'Oregons': 1...
dtype: object

它会得到一个以传入的字典为值,0到N-1为索引的Series对象。

DataFrame

DataFrame是一个表格型数据,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,可以把它想象成Excel表。DataFrame中数据是以一个或者多个二维块存放的(而不是列表、字典或别的一堆数据结构)。

如何构建DataFrame

直接传入一个等长列表或者NumPy数组组成的字典:

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

In [104]: frame = DataFrame(data)

In [105]: frame
Out[105]:
    state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Neveda  2001  2.4
4  Neveda  2002  2.9

同样DataFrame会自动加上索引,并且全部列会被有序排列。因为数据会打乱行索引,所以数据不会被自动排序。

如果不想排序列,那我们可以预先指定列的序列:

In [106]: DataFrame(data, columns=['year','state','pop'])
Out[106]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Neveda  2.4
4  2002  Neveda  2.9

这样就可以按照我们指定的序列来排序所有的列。

如何获取DataFrame中的列

可以通过属性(只读)的方式或者类似字典标记(读写)的方式获得:

In [107]: frame = DataFrame(data, columns=['year','state','pop'])

In [108]: frame
Out[108]:
   year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Neveda  2.4
4  2002  Neveda  2.9

In [109]: frame.year
Out[109]:
0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64
In [110]: frame['year']
Out[110]:
0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64
如何获取DataFrame中的某行数据
frame.loc[0]
Out[111]:
year     2000
state    Ohio
pop       1.5
Name: 0, dtype: object
In [114]: frame = DataFrame(data, columns=['year','state','pop'],index=['one','two','three','four','five'
     ...: ])

In [115]: frame.loc['two']
Out[115]:
year     2001
state    Ohio
pop       1.7
Name: two, dtype: object

可以通过DataFrame的loc函数来取出行数据。

对列进行修改

上面有说到过DataFrame获取列的读写权限,属性的方法只能读,通过字典标记形式可以进行写入操作。

In [122]: frame['num'] = 16

In [123]: frame
Out[123]:
       year   state  pop  num
one    2000    Ohio  1.5   16
two    2001    Ohio  1.7   16
three  2002    Ohio  3.6   16
four   2001  Neveda  2.4   16
five   2002  Neveda  2.9   16
In [120]: frame.num = 16

In [121]: frame
Out[121]:
       year   state  pop
one    2000    Ohio  1.5
two    2001    Ohio  1.7
three  2002    Ohio  3.6
four   2001  Neveda  2.4
five   2002  Neveda  2.9

也可以将列表或者数组赋值给它,但是要注意它的长度是否相匹配。

In [144]: frame['num'] = [5, 4, 3, 2, 1]

In [145]: frame
Out[145]:
       year   state  pop  num
one    2000    Ohio  1.5    5
two    2001    Ohio  1.7    4
three  2002    Ohio  3.6    3
four   2001  Neveda  2.4    2
five   2002  Neveda  2.9    1

如果将一个Series赋值给它,就会精确的匹配到DataFrame的索引。

In [146]: val = Series([-1.2, -1.5, -1.7],index=['two','four','five'])

In [147]: frame['val'] = val

In [148]: frame
Out[148]:
       year   state  pop  num  val
one    2000    Ohio  1.5    5  NaN
two    2001    Ohio  1.7    4 -1.2
three  2002    Ohio  3.6    3  NaN
four   2001  Neveda  2.4    2 -1.5
five   2002  Neveda  2.9    1 -1.7

如果有空位,将会自动填上NaN值。在赋值过程中,如果将要赋值的列不存在,那它会自动创建一个新列。

DataFrame的构造函数能接受的所有数据类型
  • 二维ndarray 数据矩阵,还可以传入行标和列标
  • 由数组、列表或元组组成的字典 每个序列会变成DataFrame的一列。所有序列的长度必须相同。
  • NumPy的结构化数组/记录数组 类似于“由数组组成的字典”
  • 由Series组成的字典 每个Series都会成为一列。如果没有指定行索引,则各Series的索引会被合并成结果的行索引。 每个Series的列索引就是在该字典中的键。
  • 由字典组成的字典 各内层字典会成为一列。键会被合并成结果的行索引,跟“由Series组成的字典”一样。
  • 字典或Series的列表 各项将会成为DataFrame的一行。字典键或Series索引的并集将会成为DataFrame的列标。
  • 由列标或元组组成的列表 类似于"二维ndarray"
  • 另一个DataFrame 该DataFrame的索引会被沿用,除非指定了其他索引。
  • NumPy的MaskedArray 类似于"二维ndarray"的情况,只是掩码值在DataFrame会变成NA/缺失值。

总结

今天学习了Series和DataFrame的数据结构部分。了解了它们的构建方式
Series的构建方式: data = Series([1, 2, 3]) 或者通过传入一个字典来创建Series
Series的常用功能:
Series自定义索引名称 通过在构造函数中设置索引名称来达到自定义索引的目的
Series索引的一些玩法 我们可以通过字典的形式data['one']来获得数据,也可以将其中的参数组成一个数组来获取多个数据data[['one','two','three']]
Series的运算 Series可以像NumPy一样支持数学运算,并且它的运算方式也和NumPy一样数据批量运算。

DataFrame的构建方式:直接传入一个等长列表或者NumPy数组组成的字典。
如何获取DataFrame中的数据 由于DataFrame是个表格型数据,数据也有两种类型:行数据列数据,以点属性的方式frame.year或者字典形式frame['year']都可以获得列数据。值得注意的是,点属性是获取的是带有只读属性的数据,而字典形式的则是带有读写形式的数据。如果想要修改数据还是得用字典形式来获取数据比较好。
如果是想获取行数据,可以通过loc函数来获取。例如通过行索引名称frame.loc['id'] 或者行索引序列号frame.loc[0] 来获取。
DataFrame的赋值 可以通过字典形式赋值,但要注意与数据长度必须相匹配。也可以直接赋值一个Series对象过去,这样可以在赋值的同时把索引名称也一并带过去。

学了NumPy的基础之后发现学习pandas基础会相当轻松,除了多了一个表格型数据外,它的一些核心用法是差不多的,不管是赋值也好还是索引也罢,只要稍加注意一些如读写,区分行列数据的用法就基本掌握了这些知识点了。

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

推荐阅读更多精彩内容