数据分析之Pandas

欢迎来我的个人博客:fizzyi

Pandas介绍

查看pandas版本

import pandas as pd
pd.__version__

pandas主要的两个数据结构是SeriesDataFrame
导入模块

import numpy as np
from pandas import Series,DataFrame

Pandas数据结果: Series

从一般意义上来讲,Series可以简单的被认为是一维的数组。Series和一维数组最主要的区别在与Series类型具有索引(index),可以和另一个编程中最常见的数据结构哈希联系起来。

创建Series

创建一个Series的基本格式是s = Series(data,index=index,name=name)。首先我们从数组创建Series:

a = np.random.randn(5)
print(a)
s = Series(a)
print(s)


[-1.24962807 -0.85316907  0.13032511 -0.19088881  0.40475505]

0   -1.249628
1   -0.853169
2    0.130325
3   -0.190889
4    0.404755

可以在创建Series时添加index,并可使用Series.inde查看具体的index。但是需要注意的一点是,当从数组创建Series时,若指定index,那么index长度和data的长度一致。

s = Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s)

a    0.509906
b   -0.764549
c    0.919338
d   -0.084712
e    1.896407

创建Series的另一个可选项是name,可指定Series的名称,可以用Series.name访问。

Series还可以从字典创建。

d = {'a':0,'b':1,'c':2}
print(d)

s = Series(d)
print s

{'a': 0.0, 'c': 2, 'b': 1}
a    0
b    1
c    2

使用字典创建Series时指定index的情形(index长度不必和字典相同,如果多了的话,pandas将会自动为多余的index分配NaN)

字典创建的Series,数据将按index的顺序重新排列。

Series(4,index=['a','b','c','d'])
a    4
b    4
c    4
d    4
e    4

如果数据就是一个单一的变量,如数字4,那么Series将重复这个变量。

Series 数据的访问

访问Series数据可以和数组一样使用下标,也可以像字典一样使用索引,还可以使用一些条件过滤。

s = Series(np.random.randn(10),index=['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'])
s[0]  #取第一位
s[:2]  #取0,1
s[[2,0,4]]  #取2,0,4位
s[['e','i']]  #取index为e 和 i的
s[s > 0.5] #取值大于0.5的
'e' in s  #判断s中有没有下标e

Pandas数据结构:DataFrame

DataFrame是将多个Series按列合并而成的二维数据结构,每个列单独取出来是一个Series,和SQL数据库中取出的数据是类似的。DataFrame的优势在于可以方便的处理不同类型的列。

创建DataFrame

方法一

从字典创建DataFrameDataFrame是一个二维的数据结果,是多个Series的集合体。先创建一个值是Series的字典,然后转换为DataFrame

d = {'one':Series([1.,2.,3.,],index=['a','b','c']),'two':Series([1.,2.,3.,4.],index=['a','b','c','d'])}
df = DataFrame(d)
print df

   one  two
a    1    1
b    2    2
c    3    3
d  NaN    4

可以指定所需的行和列,若字典中不含有对应的元素,则为NaN

df = DataFrame(d,index=['r','d','a'],columns=['two','three'])
print df

   two three
r  NaN   NaN
d    4   NaN
a    1   NaN
  • dataframe.indexdataframe.columns查看DataFrame的行和列
  • dataframe.values则以数组的形式返回dataframe的元素

方法二

DataFrame也可以从值是数组的字典中创建,但是各个数组的长度需要相同

d = {'one':[1,2,3,4],'tow':[4,3,2,1]}
df = DataFrame(d,index=['a','b','c','d'])
print df

   one  two
a    1    4
b    2    3
c    3    2
d    4    1

值如果不是数组,没有这一限制,并且缺失值补成NaN

如果需要创建一个空的DataFrame

df = DataFrame()

方法三

使用concat函数基于Series或者DataFrame创建一个DataFrame

a = Series(range(5))
b = Series(np.linspace(4,20,5))
df = pd.concat([a,b],axis=1)
print df 

   0   1
0  0   4
1  1   8
2  2  12
3  3  16
4  4  20

其中axis=1表示按列合并,axis=0表示按行合并。

df = DataFrame()
index = ['alpha','beta','gamma','delta','eta']
for i in range(5):
    a = DataFrame([np.linspace(i,5*i,5)],index=[index[i]])
    df = pd.concat([df,a],axis=0)
print df 

       0  1   2   3   4
alpha  0  0   0   0   0
beta   1  2   3   4   5
gamma  2  4   6   8  10
delta  3  6   9  12  15
eta    4  8  12  16  20

DataFrame数据的访问

因为DataFrame是以列作为操作的基础的,所以全部的操作都可以想象成先从DataFrame里取出来一列,再从这个series中取元素即可。

  • datafrae.column_name 只能选取一列 有列名,必须使用列名选取,在没有列名的时候是无效的。
  • dataframe[]可以选择多列 无列名 使用下标选取列
df.columns = ['a','b','c','d','e']

使用dataframe.columns为dataframe赋列名

从dataframe中单独取一列出来,其数据结构显示的是series,取两列及以上的结果仍然是dataframe。访问特定的元素可以如series一样使用下标或者是索引。

若需要选取行,可以使用dataframe.iloc按下标选取,或者使用dataframe.loc按索引选取。

print(df.iloc[1])
print(df.loc['beta'])

选取行还可以使用切片的方式或者是布尔类型的向量

print(df[1:3])
bool_vec = [True,False,True,True,False]
print(df[bool_vec])

行列组合起来选取数据

print(df[['b','d']].iloc[[1,3]])
print(df.iloc[[1,3]][['b','d']])
print(df[['b','d']].loc[['beta','delta']])
print(df.loc[['beta','delta']][['b','d']])

如果只是某个特殊位置的元素的话,dataframe.at 和dataframe.iat是最快的方式,它们分别用于使用索引和下标进行访问。

print(df.iat[2,3])
print(df.at['gamma','d'])

dataframe.ix可以混合使用索引和下标进行访问,唯一需要注意的地方是行列内部需要一致,不可以同时使用索引和下标访问行或者列。

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

推荐阅读更多精彩内容