您的位置:首页 > 编程语言 > Python开发

Python数据分析|第5章 pandas入门

2017-01-18 16:05 423 查看

pandas的数据结构介绍

Series

是由数组+索引组成

from pandas import Series, DataFrame
import pandas as pd
obj=Series([4,7,-5,4])
obj
Out[5]:
0    4
1    7
2   -5
3    4
dtype: int64


指定索引

obj2=Series([4,7,-5,3],index=['d','b','a','c'])
obj2
Out[7]:
d    4
b    7
a   -5
c    3
obj2.index
Out[8]: Index([u'd', u'b', u'a', u'c'], dtype='object')


通过字典来创建Series

sdata={'A':35000,'B':70000,'C':9000}
obj3=Series(sdata)

obj3
Out[11]:
A    35000
B    70000
C     9000


Series在算术运算中会自动对齐不同索引的数据,如果有缺失值最后显示缺失值

DataFrame

直接传入数据,然后输入:

frame=DataFrame(data,columns=['year','state','pop'])#可按指定顺序排序,也可不写


可用index指定固定位置,填入数据,未指定位置为缺失值

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


删除列

del frame2['eastern']


基本功能

重新索引reindex

obj2=obj.reindex(['a','b','d','c','e']) #可重新排列顺序
obj2=obj.reindex(['a','b','d','c','e','f'],fill_value=0)#新加的值显示为0,否则为NaN


使用ffill可以实现前向值填充

obj3=Series(['blue','purple','yellow'],index=[0,2,4])

obj3.reindex(range(6),method='ffill')
Out[13]:
0      blue
1      blue
2    purple
3    purple
4    yellow
5    yellow


method选项说明
fill或pad前向填充(或搬运)值
bfill或backfill后向填充(或搬运)值
对于DataFrame,reindex可以修改行列索引

frame.reindex(['a','b','c','d'])#行索引
frame.reindex(columns=['a','b','c','d'])#列索引


丢弃指定轴上的项

obj.drop()


索引、选取和过滤

索引选项

类型说明
obj[]选取列
obj.ix选取行
obj.ix[:,val]选取单个列或列子集
obj.ix[val1,val2]同时选行和列
reindex方法新索引
xs方法根据标签选取单行单列,返回一个Series
icol、irow方法根据整数位置选取
get_value、set_value方法根据行列标签选取单个值

算术运算和数据对齐

pandas会自动对齐索引,不对齐会有缺失值

可以使用传入方式来避免

df1.add(df2,fill_value=0)#算术方法:add,sub,div,mul


DataFrame和Series之间的运算叫做广播,Series产生的运算效果会在DataFrame每一行实现

import numpy as np
arr=np.arange(12.).reshape((3,4))

arr
Out[18]:
array([[  0.,   1.,   2.,   3.],
[  4.,   5.,   6.,   7.],
[  8.,   9.,  10.,  11.]])

arr[0]
Out[19]: array([ 0.,  1.,  2.,  3.])

arr-arr[0]
Out[20]:
array([[ 0.,  0.,  0.,  0.],
[ 4.,  4.,  4.,  4.],
[ 8.,  8.,  8.,  8.]])


在列上广播需要使用算术运算方法,如

frame.sub(series3,axis=0)


函数应用和映射

frame=DataFrame(np.random.randn(4,3),columns=list('bde'),index=['A','B','C','D'])

frame
Out[23]:
b         d         e
A -0.755157 -0.443902 -0.052897
B -1.426624  0.969115 -0.803178
C  0.100829 -1.558963  0.421726
D -1.290333  1.158463  0.918981

f=lambda x:x.max()-x.min()

frame.apply(f)
Out[25]:
b    1.527453
d    2.717425
e    1.722159
dtype: float64

frame.apply(f,axis=1)
Out[26]:
A    0.702260
B    2.395739
C    1.980689
D    2.448795
dtype: float64


def f(x):
return Series([x.min(),x.max()],index=['min','max'])

frame.apply(f)
Out[28]:
b         d         e
min -1.426624 -1.558963 -0.803178
max  0.100829  1.158463  0.918981


applymap-元素级函数

format=lambda x:'%.2f'%x

frame.applymap(format)
Out[30]:
b      d      e
A  -0.76  -0.44  -0.05
B  -1.43   0.97  -0.80
C   0.10  -1.56   0.42
D  -1.29   1.16   0.92


map

frame['e'].map(format)
Out[31]:
A    -0.05
B    -0.80
C     0.42
D     0.92


排序和排名

按索引排序

frame.sort_index()
frame.sort_index(axis=1)#行倒序,列正序
frame.sort_index(axis=1,ascending=False)#均倒序


按值排序

obj.order()


by选项

frame=DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})

frame.sort_index(by='b')
Out[33]:
a  b
2  0 -3
3  1  2
0  0  4
1  1  7


汇总和计算描述统计

df.sum(axis=1,skipna=False)


选项说明
axis约简的轴。DataFrame的行用0,列用1
skipna排除缺失值,默认值为True
level如果轴是层次化索引的(Multilndex),则根据level分组
描述和汇总统计

方法说明
count非NA值的数量
describe总统计
min、max
argmin、argmax最大最小值的索引位置
idxmin、idxmax最大最小值的索引值
quantile分位数
sum、mean、median
mad根据平均值计算平均绝对离差
var、std、skew、kurt
cumsum累计和
cummin、cummax、cumprod累计最大最小,累计积
diff一阶差分(时间序列)
pct_change百分数变化

相关系数与协方差

returns.MSFT.corr(returns.IBM)#相关系数
returns.MSFT.cov(returns.IBM)#协方差


整体

returns.corr()
returns.cov()


corrwith计算一个DataFrame和一个Series之间的相关系数

returns.corrwith(returns.IBM)#axis=1可进行行计算


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

obj.unique() #唯一
obj.value_counts()#计算一个Series中各值出现的频率
pd.value_counts(obj.values,sort=False) #频率排序

mask=obj.isin(['b','c']) #成员资格
obj[mask]


处理缺失数据

方法说明
dropna过滤
fillna用指定值或插值方法填充
isnull判断
notnullisnull的否定式
1. 滤除

from numpy import nan as NA
data=Series([1,NA,3.5,NA,7])
data.dropna()

data=DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])
cleaned=data.dropna() #drop任何含有缺失值的行
data.dropna(how='all') #drop全为NA的行
data.dropna(axis=1,how='all') #drop全为NA的列


填充

df.fillna(0) #缺失值替换为0
_=df.fillna(0,inplace=True) #对现有对象就地修改

from numpy import nan as NA
df=DataFrame(numpy.random.randn(6,3))
df.ix[2:,1]=NA;df.ix[4:,2]=NA

df
Out[14]:
0         1         2
0 -1.159237  1.070004 -0.814501
1 -1.222677  0.715792 -0.965154
2  1.051073       NaN -0.662791
3 -0.464988       NaN  1.346032
4 -0.725837       NaN       NaN
5 -0.216968       NaN       NaN

df.fillna(method='ffill',limit=2)
Out[16]:
0         1         2
0 -1.159237  1.070004 -0.814501
1 -1.222677  0.715792 -0.965154
2  1.051073  0.715792 -0.662791
3 -0.464988  0.715792  1.346032
4 -0.725837       NaN  1.346032
5 -0.216968       NaN  1.346032


fillna函数

参数说明
value填充值
method插值方式,默认为ffill
axis待填充的轴,默认axis=0
inplace就地修改对象
limit修改数

层次化索引

以低维度处理高维度

data=Series(numpy.random.randn(10),
index=[['a','a','a','b','b','b','c','c','d','d'],
[1,2,3,1,2,3,1,2,2,3]])

data
Out[19]:
a  1   -0.269781
2    1.247638
3   -0.537622
b  1    0.604351
2    0.124396
3   -1.991048
c  1    0.067274
2   -0.816543
d  2   -0.106579
3   -1.037246

data['b':'c']
Out[20]:
b  1    0.604351
2    0.124396
3   -1.991048
c  1    0.067274
2   -0.816543

data[:,2]
Out[21]:
a    1.247638
b    0.124396
c   -0.816543
d   -0.106579


unstack重新安排

data.unstack()
Out[22]:
1         2         3
a -0.269781  1.247638 -0.537622
b  0.604351  0.124396 -1.991048
c  0.067274 -0.816543       NaN
d       NaN -0.106579 -1.037246

data.unstack().stack() #unstack逆运算

frame=DataFrame(numpy.arrange(12).reshape((4,3)),index=[……],columns=[……])


重排分级顺序

frame.swaplevel('key1','key2') #其中key1,key2是列名称
frame.index.names=[]
frame.columns.names=[]

#sortlevel是对单个级别数据排序
frame.swaplevel(0,1).sortlevel(0) #先交换再排序


级别汇总

frame.sum(level='key2')
frame.sum(level='color',axis=1)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据分析