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

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 判断
notnull isnull的否定式

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的列
  1. 填充
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数据分析)