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判断
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的列
  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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值