pandas简介

网友投稿 773 2022-11-17

pandas简介

pandas简介

pandas是基于NumPy构建的,让以NumPy为中心的应用变得更加简单。

引入约定

from pandas import Series,DataFrameimport pandas as pd

pandas的数据结构

Series和DataFrame

Series

Series是一种类似一维数组的对象,由一组数据和相关的索引组成。

>>> obj = Series([4,7,-5,3])>>> obj0 41 72 -53 3dtype: int64

它的索引写在左边一列。

可以通过values和index属性获取数组表示形式和索引对象。

>>> obj.valuesarray([ 4, 7, -5, 3], dtype=int64)>>> obj.indexRangeIndex(start=0, stop=4, step=1)

它的索引可以通过如下的方式自定义:

>>> obj2 = Series([4,7,-5,3],index=['d','b','a','c'])>>> obj2d 4b 7a -5c 3dtype: int64>>> obj2.indexIndex([u'd', u'b', u'a', u'c'], dtype='object')

访问和设置值:

>>> obj2['a']-5>>> obj2['a'] = 5>>> obj2d 4b 7a 5c 3dtype: int64>>> obj2['a']5>>> obj2[obj2>4]b 7a 5dtype: int64>>> obj2 * 2d 8b 14a 10c 6dtype: int64>>> np.exp(obj2)d 54.598150b 1096.633158a 148.413159c 20.085537dtype: float64

Series的索引可以通过赋值的方式就地修改

>>> obj.index = ['bob','steve','jeff','ryan']>>> objbob 1steve 2jeff 3ryan 4

DataFrame

是一个表格型的数据结构。既有行索引,也有列索引。

构建DataFrame: 下面是通过由等长列表构成的字典构造:

>>> data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.1,2.2,3.3,4.4,2.9]}>>> frame = DataFrame(data)>>> frame pop state year0 1.1 Ohio 20001 2.2 Ohio 20012 3.3 Ohio 20023 4.4 Nevada 20014 2.9 Nevada 2002

还可以指定列的序列

>>> DataFrame(data,columns=['year','state','pop']) year state pop0 2000 Ohio 1.11 2001 Ohio 2.22 2002 Ohio 3.33 2001 Nevada 4.44 2002 Nevada 2.9

可以通过以下方式,将DataFrame的列以Series的形式获取:

>>> frame['state']0 Ohio1 Ohio2 Ohio3 Nevada4 NevadaName: state, dtype: object>>> frame.year0 20001 20012 20023 20014 2002Name: year, dtype: int64

行也可以通过为止或名称的方式进行获取:

>>> frame.ix[2]pop 3.3state Ohioyear 2002Name: 2, dtype: object

可通过赋值的方式修改或添加列:

>>> frame['new_line'] = 5.5>>> frame pop state year new_line0 1.1 Ohio 2000 5.51 2.2 Ohio 2001 5.52 3.3 Ohio 2002 5.53 4.4 Nevada 2001 5.54 2.9 Nevada 2002 5.5>>> frame['new_line'] = np.arange(5.)>>> frame pop state year new_line0 1.1 Ohio 2000 0.01 2.2 Ohio 2001 1.02 3.3 Ohio 2002 2.03 4.4 Nevada 2001 3.04 2.9 Nevada 2002 4.0

del用于删除列:

>>> del frame['new_line']>>> frame pop state year0 1.1 Ohio 20001 2.2 Ohio 20012 3.3 Ohio 20023 4.4 Nevada 20014 2.9 Nevada 2002

通过索引方式返回的列是相应数据的视图,对返回的Series所做的任何就地修改全都会反映到源DataFrame上。

还有一种常见的数据形式是嵌套字典,它会解释为:外层字典的键作为列(Nevada、Ohio);内层键则作为行索引:

>>> pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}>>> frame = DataFrame(pop)>>> frame Nevada Ohio2000 NaN 1.52001 2.4 1.72002 2.9 3.6

如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来:

>>> frame.index.name = 'year'>>> frame.columns.name='state'>>> framestate Nevada Ohioyear 2000 NaN 1.52001 2.4 1.72002 2.9 3.6

values属性会以二维ndarray的形式返回DataFrame中的数据:

>>> frame.valuesarray([[ nan, 1.5], [ 2.4, 1.7], [ 2.9, 3.6]])

基本功能

重新索引

创建一个适应新索引的新对象

>>> obj = Series([4.5,7.2,-5.3,3.6],index = ['d','b','a','c'])>>> objd 4.5b 7.2a -5.3c 3.6dtype: float64>>> obj2 = obj.reindex(['a','b','c','d','e'])>>> obj2a -5.3b 7.2c 3.6d 4.5e NaNdtype: float64>>> obj.reindex(['a','b','c','d','e'],fill_value=0)a -5.3b 7.2c 3.6d 4.5e 0.0dtype: float64

method选项中的ffill参数可以向前搬运值

>>> obj3 = Series(['blue','purple','yellow'],index = [0,2,4])>>> obj30 blue2 purple4 yellowdtype: object>>> obj3.reindex(range(6),method='ffill')0 blue1 blue2 purple3 purple4 yellow5 yellowdtype: object

0,2,4分别对应blue,purple,yellow。1,3,5取的是前一个索引的值。

参数

说明

ffill或pad

向前搬运值

bfill或backfill

向后搬运值

索引、选取和过滤

>>> obj = Series(np.arange(4.),index=['a','b','c','d'])>>> obj['b']1.0>>> obja 0.0b 1.0c 2.0d 3.0dtype: float64>>> obj[1]1.0>>> obj[obj<2]a 0.0b 1.0dtype: float64>>> obj['b':'c'] #这与Python切片运算不同,其末端是包含的。即封闭区间b 1.0c 2.0dtype: float64

对DataFrame进行索引其实就是获取一个或多个列:

>>> data = DataFrame(np.arange(16).reshape((4,4)),index=['Shenzhen','Shanghai','Changsha','Beijing'],columns=['one','two','three','four'])>>> data one two three fourShenzhen 0 1 2 3Shanghai 4 5 6 7Changsha 8 9 10 11Beijing 12 13 14 15>>> data['two']Shenzhen 1Shanghai 5Changsha 9Beijing 13Name: two, dtype: int32>>> data[['three','one']] three oneShenzhen 2 0Shanghai 6 4Changsha 10 8Beijing 14 12

这种索引方式有几个特殊情况,首先通过切片或布尔型数组选取行:

>>> data[:2] one two three fourShenzhen 0 1 2 3Shanghai 4 5 6 7>>> data[data['three']>5] #就是2,3,4行;three列的第一行是2,不满足条件 one two three fourShanghai 4 5 6 7Changsha 8 9 10 11Beijing 12 13 14 15

另一种用法是通过布尔型DataFrame(下面这个由标量比较运算得出)进行索引:

>>> data<5 one two three fourShenzhen True True True TrueShanghai True False False FalseChangsha False False False FalseBeijing False False False False>>> data[data<5] = 0>>> data one two three fourShenzhen 0 0 0 0Shanghai 0 5 6 7Changsha 8 9 10 11Beijing 12 13 14 15

索引字段​​ix​​,通过它可以用NumPy式的标记法以及轴标签从DataFrame中选取行和列的子集。这是一种重新索引的简单手段:

>>> data.ix['Shanghai',['two','three']] #选取行'Shanghai',列'two','three'two 5three 6Name: Shanghai, dtype: int32>>> data.ix[2] #选取第3(索引从0开始)行,这里是以列的形式展示one 8two 9three 10four 11Name: Changsha, dtype: int32>>> data.ix[:'Changsha','two'] #选取前3行,第2列Shenzhen 0Shanghai 5Changsha 9Name: two, dtype: int32>>> data.ix[data.three>5,:3]#选取后三行,前三列 one two threeShanghai 0 5 6Changsha 8 9 10Beijing 12 13 14

DataFrame的索引选项

[外链图片转存失败(img-IExchAv3-1566538654218)(index_files/b5ceb5ec-d8af-4912-933f-4e72ab9dbf5b.jpg)] [外链图片转存失败(img-T4Q2q2Xe-1566538654219)(index_files/0a101386-b9c1-44bf-85a4-e9f23c237b7a.jpg)]

DataFrame和Series之间的运算

计算一个二维数组与其某行之间的差:

>>> arr = np.arange(12.).reshape((3,4))>>> arrarray([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]])>>> arr[0]array([ 0., 1., 2., 3.])>>> arr - arr[0]array([[ 0., 0., 0., 0.], [ 4., 4., 4., 4.], [ 8., 8., 8., 8.]])

这叫做广播。DataFrame与Series之间的运算差不多也是如此:

>>> df1 = DataFrame(np.arange(9.).reshape((3,3)),columns=list('bcd'),index=['Ohio','Texas','Colorado'])>>> df2 = DataFrame(np.arange(12.).reshape((4,3)),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])>>> df1 b c dOhio 0.0 1.0 2.0Texas 3.0 4.0 5.0Colorado 6.0 7.0 8.0>>> df2 b d eUtah 0.0 1.0 2.0Ohio 3.0 4.0 5.0Texas 6.0 7.0 8.0Oregon 9.0 10.0 11.0>>> df1 + df2 #相加后的DataFrame索引和列为原来的两个DataFrame的并集 b c d eColorado NaN NaN NaN NaNOhio 3.0 NaN 6.0 NaNOregon NaN NaN NaN NaNTexas 9.0 NaN 12.0 NaNUtah NaN NaN NaN NaN

函数应用和映射

NumPy的元素级别方法也可用于操作pandas对象:

>>> frame = DataFrame(np.random.randn(4,3),columns=list('bde'),index=['Utah','Ohio','Texas','Oregon'])>>> frame b d eUtah -0.754242 1.374050 -2.396724Ohio -0.919466 1.220883 -0.933032Texas 1.874174 -2.341060 1.043491Oregon 0.265324 -0.557416 -0.347104>>> np.abs(frame) b d eUtah 0.754242 1.374050 2.396724Ohio 0.919466 1.220883 0.933032Texas 1.874174 2.341060 1.043491Oregon 0.265324 0.557416 0.347104

还可以将函数应用到由各列或行所形成的一维数组上。DataFrame的​​apply​​方法即可实现此功能:

>>> f = lambda x: x.max() - x.min()>>> frame.apply(f)b 2.793640d 3.715110e 3.440215dtype: float64

轴是为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。 Pandas保持了Numpy对关键字axis的用法,用法在Numpy库的词汇表当中有过解释: 如果简单点来说,就是0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算。

>>> frame.apply(f,axis=1)Utah 3.770774Ohio 2.153916Texas 4.215234Oregon 0.822741dtype: float64>>> frame.apply(f,axis=0)b 2.793640d 3.715110e 3.440215

元素级的函数也是可以用的,如果想得到frame中各个浮点值的格式化字符串,使用​​applymap​​即可:

>>> format = lambda x: '%.2f' % x>>> frame.applymap(format) b d eUtah -0.75 1.37 -2.40Ohio -0.92 1.22 -0.93Texas 1.87 -2.34 1.04Oregon 0.27 -0.56 -0.35

排序和排名

根据索引排序:

>>> obj = Series(range(4),index=list('dabc'))>>> obj.sort_index()a 1b 2c 3d 0

对于DataFrame,则可以根据任意一个轴上的索引来进行排序:

>>> frame = DataFrame(np.arange(8).reshape((2,4)),index=['three','one'],columns=list('dabc'))>>> frame d a b cthree 0 1 2 3one 4 5 6 7>>> frame.sort_index() d a b cone 4 5 6 7three 0 1 2 3>>> frame.sort_index(axis=1) a b c dthree 1 2 3 0one 5 6 7 4

如果要按值进行排序,对于Series来说,使用其​​sort_values​​方法:

>>> obj.sort_values()2 -33 20 41 7

对于DataFrame,可根据一个或多个列中的值进行排序,将这些列的名称传递给by选项即可:

>>> frame = DataFrame({'b':[4,7,-3,2],'a':[0,1,0,1]})>>> frame a b0 0 41 1 72 0 -33 1 2>>> frame.sort_index(by='b'):1: FutureWarning: by argument to sort_index is deprecated, please use .sort_values(by=...) a b2 0 -33 1 20 0 41 1 7>>> frame.sort_values(by='b') #那么就用sort_values a b2 0 -33 1 20 0 41 1 7

处理缺失数据

pandas使用NaN表示负电和非浮点数组中的缺失数据。

NA处理方法

方法

说明

dropna

根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度

fillna

用指定值或插值方法(如ffill或bfill)填充缺失数据

isnull

返回一个含有布尔值的对象

notnull

isnull的否定式

滤除缺失数据

对于一个Series,dropna返回一个仅含非空数据和索引值的Series:

>>> from numpy import nan as NA>>> data = Series([1,NA,3.5,NA,7])>>> data.dropna()0 1.02 3.54 7.0dtype: float64

对于DataFrame对象,你可能希望丢弃全NA或含有NA的行或列。dropna默认丢弃任何含有缺失值的行:

>>> data = DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])>>> data 0 1 20 1.0 6.5 3.01 1.0 NaN NaN2 NaN NaN NaN3 NaN 6.5 3.0>>> data.dropna() 0 1 20 1.0 6.5 3.0

传入how='all’将只会丢弃全为NA的那些行:

>>> data.dropna(how='all') 0 1 20 1.0 6.5 3.01 1.0 NaN NaN3 NaN 6.5 3.0

如果同时传入axis=1,就会丢弃列:

>>> data[4] = NA>>> data 0 1 2 40 1.0 6.5 3.0 NaN1 1.0 NaN NaN NaN2 NaN NaN NaN NaN3 NaN 6.5 3.0 NaN>>> data.dropna(axis=1,how='all') 0 1 20 1.0 6.5 3.01 1.0 NaN NaN2 NaN NaN NaN3 NaN 6.5 3.0

填充缺失数据

>>> df 0 1 20 -0.526012 NaN NaN1 -0.046144 NaN NaN2 -0.606856 NaN NaN3 -0.793046 NaN -0.3673884 -0.494585 NaN -1.7734085 -0.011493 -0.542106 -0.7140986 -1.218056 0.023548 -1.239914>>> df.fillna(0) 0 1 20 -0.526012 0.000000 0.0000001 -0.046144 0.000000 0.0000002 -0.606856 0.000000 0.0000003 -0.793046 0.000000 -0.3673884 -0.494585 0.000000 -1.7734085 -0.011493 -0.542106 -0.7140986 -1.218056 0.023548 -1.239914

如果通过一个字典调用fillna,就可以实现对不同的列填充不同的值:

>>> df.fillna({1:0.5,3:-1}) #这里没有索引为3的列 0 1 20 -0.526012 0.500000 NaN1 -0.046144 0.500000 NaN2 -0.606856 0.500000 NaN3 -0.793046 0.500000 -0.3673884 -0.494585 0.500000 -1.7734085 -0.011493 -0.542106 -0.7140986 -1.218056 0.023548 -1.239914

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:docker入门——简介
下一篇:以卡通的方式了解Kubernetes
相关文章

 发表评论

暂时没有评论,来抢沙发吧~