python数据分析-Pandas

作者:hooly
微信公号:一口袋星光


初始pandas

pandas 是一个能使数据分析变得更快更简单的高级数据结构和操作工具。
pandas是在numpy的基础上构建的,让以numpy为中心的应用变得更简单。

安装

我们可以通过pip来安装pandas
<code>sudo pip install pandas<code>

引入包

<code>from pandas import Series,DataFrame
import pandas as pd<code>

pandas的数据结构

pandas 有两个主要的数据结构:Series,DataFrame
Series 是一种类似于数组的对象,由一组数据以及一组与之相关的数据标签(索引)组成:
<code>obj = Series([3,4,5,-4])<code>

Series

Series的字符串表现形式:索引在左侧,值在右侧。如果我们没有手动指定索引,Series会默认创建从0到N-1的整数类型的索引。
可以通过.values和.index来获取数组表现形式和索引对象
<code>obj.values
obj.index<code>


image.png

指定索引:
<code> obj2 = Series([3,4,5,-4],index = ['a','b','c','d'])
obj2
obj2.index<code>

image.png

随便打印索引值为某个值的值(有点绕口哈)
<code>obj2['a']
obj2[['a','c','d']]
注意这里是双中括号<code>

image.png

如果数据存在某python字典中,也可以通过字典创建Series:
<code>In [68]: sdata = {'a':100,'b':200,'c':300,'d':400}
In [69]: obj2 = Series(sdata)
In [70]: obj2
Out[70]:
a 100
b 200
c 300
d 400
dtype: int64<code>

image.png

如果只传入一个字典,且不指定索引:
<code>In [71]: states = ['a','b','c','d']
In [72]: obj4 = Series(states)
In [73]: obj4
Out[73]:
0 a
1 b
2 c
3 d
dtype: object<code>

如果只传入一个字典,且指定索引:
<code>In [74]: obj5 = Series(index = states)
In [75]: obj5
Out[75]:
a NaN
b NaN
c NaN
d NaN
dtype: float64<code>

如果只传入一个字典,指定值,指定索引:
<code>In [76]: obj5 = Series(sdata,index = states)
In [77]: obj5
Out[77]:
a 100
b 200
c 300
d 400
dtype: int64<code>

image.png

上面我们可以看到一个缺失字段的表示:NA,pandas的isnull和notnull函数可以用于检测缺失的数据:

<code>In [79]: pd.isnull(obj5)
Out[79]:
a False
b False
c False
d False
dtype: bool
In [80]: pd.notnull(obj5)
Out[80]:
a True
b True
c True
d True
dtype: bool<code>

image.png

Series也有此类的用法:
<code>In [81]: obj4.isnull()
Out[81]:
0 False
1 False
2 False
3 False
dtype: bool<code>

image.png

Series还有一个name的属性,是整个Series的name,不是某个值。如果不指定的话Series这个name属性就是缺省的,如果指定的话,这个name属性值就被填充:
<code>In [87]: obj5
Out[87]:
a 100
b 200
c 300
d 400
dtype: int64
In [88]: obj5.name = 'Name'
In [89]: obj5
Out[89]:
a 100
b 200
c 300
d 400
Name: Name, dtype: int64<code>

image.png

Series的索引还可以通过赋值的方式进行修改:

<code>In [90]: obj5.index = ['one','two','three','four']
In [91]: obj5
Out[91]:
one 100
two 200
three 300
four 400
Name: Name, dtype: int64<code>

image.png

DateFrame

DataFrame是一个表格型的数据结构,你可以理解为“二维表”,它含有一组有序的列,每列可以是不同的数据类型(数值、字符串、布尔类型)DataFrame既有行索引,也有列索引,它也可以被看为是Series组成的字典(Series共用一个索引)。

构建DataFrame
最常见的方法是传入一个等长列表或者Numpy数组组成的字典

<code>In [94]: data = {'states':['a','a','a','b','b'],'year':[2000,2001,2002,2003,2004
...: ],'pop':[1,2,3,4,5]}
In [95]: frame = DataFrame(data)
In [96]: frame
Out[96]:
pop states year
0 1 a 2000
1 2 a 2001
2 3 a 2002
3 4 b 2003
4 5 b 2004<code>

image.png

如果我们制定列的顺序,那么DataFrame的列的顺序就会按照我们指定的顺序:

<code>In [97]: frame = DataFrame(data,columns=['states','year','pop'])
In [98]: frame
Out[98]:
states year pop
0 a 2000 1
1 a 2001 2
2 a 2002 3
3 b 2003 4
4 b 2004 5<code>

image.png

和Series一样,如果传入的列在数据中找到不到,就会产生NA:

<code>In [100]: frame2 = DataFrame(data,columns=['states','year','pop','new'],index = ['one','two'
...: ,'three','four','five'])
In [101]: frame2
Out[101]:
states year pop new
one a 2000 1 NaN
two a 2001 2 NaN
three a 2002 3 NaN
four b 2003 4 NaN
five b 2004 5 NaN<code>

image.png

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

<code>In [102]: frame2['states']
Out[102]:
one a
two a
three a
four b
five b
Name: states, dtype: object
In [103]: frame2.year
Out[103]:
one 2000
two 2001
three 2002
four 2003
five 2004
Name: year, dtype: int64<code>

image.png

这里需要注意,获取到的Series的索引还是原来DataFrame的索引,并且连Name也已经设置好了。
我们试一下获取DataFrame中的一行:
<code>In [104]: frame2.ix['three']
Out[104]:
states a
year 2002
pop 3
new NaN
Name: three, dtype: object<code>

这里Name被设置成DataFrame这一行的索引。


image.png

我们看到frame2的debt的列是值都是NA,我们可以通过赋值的方式给这一列进行赋值。

<code>In [105]: frame2['debt'] = 13
In [106]: frame2
Out[106]:
states year pop new debt
one a 2000 1 NaN 13
two a 2001 2 NaN 13
three a 2002 3 NaN 13
four b 2003 4 NaN 13
five b 2004 5 NaN 13<code>

image.png

再赋值一次:

<code>In [107]: frame2['debt'] = np.arange(5.)
In [108]: frame2
Out[108]:
states year pop new debt
one a 2000 1 NaN 0.0
two a 2001 2 NaN 1.0
three a 2002 3 NaN 2.0
four b 2003 4 NaN 3.0
five b 2004 5 NaN 4.0<code>

image.png

如果给列赋值,必须保持和DataFrame的长度是一致的,如果想要赋的值是一个Series,那么会精确的匹配索引,没有值的位置会被填充上NA

<code>In [109]: val = Series(['1.2','1.3','1.4'],index=['two','three','four'])
In [110]: frame2['debt']=val
In [111]: frame2
Out[111]:
states year pop new debt
one a 2000 1 NaN NaN
two a 2001 2 NaN 1.2
three a 2002 3 NaN 1.3
four b 2003 4 NaN 1.4
five b 2004 5 NaN NaN<code>

image.png

如何删除DateFrame中的一列:

<code>In [112]: del frame2['new']
In [113]: frame2
Out[113]:
states year pop debt
one a 2000 1 NaN
two a 2001 2 1.2
three a 2002 3 1.3
four b 2003 4 1.4
five b 2004 5 NaN<code>

image.png

需要注意的是:通过索引的方式返回的列只是相应数据的视图而已,因此,对返回的Series所做的任何操作都会反映到DataFrame上。通过Series的copy方法既可以显式的复制列。

另一种常见的形式 叫做"字典的字典",字典嵌套:

<code>In [10]: pop ={'a':{1:1000,2:2000},'b':{3:3000,4:4000},'c':{5:5000,6:6000}}
In [11]: pop
Out[11]: {'a': {1: 1000, 2: 2000}, 'b': {3: 3000, 4: 4000}, 'c': {5: 5000, 6: 6000}}<code>

把嵌套了字典的字典还给DataFrame的时候,会被解释成:外层的键作为列,内层的键作为行索引,

<code>frame3 = pd.DataFrame(pop)
In [12]: frame3 = pd.DataFrame(pop)
In [12]: frame3
Out[13]:
a b c
1 1000.0 NaN NaN
2 2000.0 NaN NaN
3 NaN 3000.0 NaN
4 NaN 4000.0 NaN
5 NaN NaN 5000.0
6 NaN NaN 6000.0<code>

image.png

我们可以对结果进行转置:

<code>In [15]: frame3.T
Out[15]:
1 2 3 4 5 6
a 1000.0 2000.0 NaN NaN NaN NaN
b NaN NaN 3000.0 4000.0 NaN NaN
c NaN NaN NaN NaN 5000.0 6000.0<code>

image.png

Series的字典也以相同的方式来处理:
<code>In [16]: pdata = {'a': frame3['a'][:-1],'b':frame3['b'][:-2]}
In [17]: pdata
Out[17]:
{'a': 1 1000.0
2 2000.0
3 NaN
4 NaN
5 NaN
Name: a, dtype: float64, 'b': 1 NaN
2 NaN
3 3000.0
4 4000.0
Name: b, dtype: float64}
In [18]: frame4 = pd.DataFrame(pdata)
In [19]: frame4
Out[19]:
a b
1 1000.0 NaN
2 2000.0 NaN
3 NaN 3000.0
4 NaN 4000.0<code>

image.png

可以输入给DataFrame构造器的数据如下:

<ol>
<li>二维ndarray</li>
<li>由数组、列表或者元祖组成的字典</li>
<li>Numpy的结构化/记录数组</li>
<li>由Series组成的字典</li>
<li>由字典组成的字典</li>
<li>字典或者Serie的列表</li>
<li>由列表或者元祖组成的列表</li>
<li>另一个DataFrame</li>
<li>Numpy的MaskedArray</li>
</ol>


作者:hooly
微信公号:一口袋星光
我会在微信公号上持续更新我的文章,你来讨论我很欢迎。

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

推荐阅读更多精彩内容