pandas数据结构Series学习

来源:互联网 发布:mac怎么看硬盘文件 编辑:程序博客网 时间:2024/05/16 15:40

pandas的两个主要数据结构:Series和DataFrame

Series是一种类似于一维数组的对象,由一组数据和一组数据标签(即索引)组成。

Series对象创建方法:

①直接传入值列表,创建默认0到N-1(N为数组的长度)整数索引Series对象

In [1]: import numpy as npIn [2]: import pandas as pdIn [3]: pd.Series([1,3,5,np.nan,6,8])Out[3]:0    1.01    3.02    5.03    NaN4    6.05    8.0dtype: float64
②创建指定数据标签的Series对象
In [8]: pd.Series([1,3,5,np.nan,6,8],index=['A','B','C','D','E','F'])Out[8]:A    1.0B    3.0C    5.0D    NaNE    6.0F    8.0dtype: float64

③利用字典创建Series对象,字典的键当作Series对象的索引(有序排列)

In [13]: data = {'A':2,'B':4,'D':8,'C':16}In [14]: s2 = pd.Series(data)In [15]: s2Out[15]:A     2B     4C    16D     8dtype: int64
④字典键根据指定索引匹配创建Series对象,匹配上的取字典values,否则取Nan
In [16]: idx = ['A','B','D','G']In [17]: s3 = pd.Series(data,index=idx)In [18]: s3Out[18]:A    2.0B    4.0D    8.0G    NaNdtype: float64
Series对象属性:

①shape属性获取数组的形状

In [9]: s = pd.Series([1,3,5,np.nan,6,8])In [10]: s.shapeOut[10]: (6,)
②dtype属性获取数组的数据类型
In [12]: s = pd.Series([1,3,5,np.nan,6,8])In [13]: s.dtypeOut[13]: dtype('float64')
③values属性获取数组的内容
In [4]: s = pd.Series([1,3,5,np.nan,6,8])In [5]: s.valuesOut[5]: array([  1.,   3.,   5.,  nan,   6.,   8.])
④index属性获取数组的索引
In [6]: s = pd.Series([1,3,5,np.nan,6,8])In [7]: s.indexOut[7]: RangeIndex(start=0, stop=6, step=1)

⑤Series对象本身及索引的name属性

In [23]: s3.name='data'In [24]: s3.index.name='idx'In [25]: s3Out[25]:idxA    2.0B    4.0D    8.0G    NaNName: data, dtype: float64
Series缺失数据处理

①检查缺失数据

In [19]: pd.isnull(s3)Out[19]:A    FalseB    FalseD    FalseG     Truedtype: boolIn [20]: pd.notnull(s3)Out[20]:A     TrueB     TrueD     TrueG    Falsedtype: boolIn [21]: s3.isnullOut[21]:<bound method NDFrame.isnull of A    2.0B    4.0D    8.0G    NaNdtype: float64>In [22]: s3.notnullOut[22]:<bound method NDFrame.notnull of A    2.0B    4.0D    8.0G    NaNdtype: float64>

 ②删除缺失数据

In [29]: s3.dropna()#返回删除Nan后数据,原s3不受影响Out[29]:A    2.0B    4.0C    8.0Name: data, dtype: float64In [30]: s3Out[30]:A    2.0B    4.0C    8.0D    NaNName: data, dtype: float64  In [31]: s3[s3.notnull()]#通过布尔索引获取不为Nan数据Out[31]:A    2.0B    4.0C    8.0Name: data, dtype: float64

③填充缺失数据

In [32]: s3.fillna(0)#用0填充缺失数据Out[32]:A    2.0B    4.0C    8.0D    0.0Name: data, dtype: float64In [40]: s3.fillna(s3.mean())#用均值填充缺失数据Out[40]:A    6.0B    4.0C    8.0D    6.0Name: data, dtype: float64In [33]: s3.fillna(method='ffill')#向前填充Out[33]:A    2.0B    4.0C    8.0D    8.0Name: data, dtype: float64In [36]: s3.A=NoneIn [37]: s3Out[37]:A    NaNB    4.0C    8.0D    NaNName: data, dtype: float64In [39]: s3.fillna(method='bfill')#向后填充Out[39]:A    4.0B    4.0C    8.0D    NaNName: data, dtype: float64In [41]: s3.fillna(method ='bfill',limit=1)#向后填充,同时控制填充的次数Out[41]:A    4.0B    4.0C    8.0D    NaNName: data, dtype: float64
Series数据选择:
首先新建Series对象s:

In [1]: import pandas as pdIn [2]: import numpy as npIn [3]: s = pd.Series([1,3,5,np.nan,6,8],index=['A','B','C','D','E','F'])In [4]: sOut[4]:A    1.0B    3.0C    5.0D    NaNE    6.0F    8.0dtype: float64
①下标位置整数索引

In [5]: s[1]#获取单值Out[5]: 3.0In [6]: s[[1,2,3]]#获取多值Out[6]:B    3.0C    5.0D    NaNdtype: float64

②数据标签索引

In [7]: s['B']Out[7]: 3.0In [8]: s[['B','C','D']]Out[8]:B    3.0C    5.0D    NaNdtype: float64


③通过get()或get_value()或get_values()函数获取
get(self, key, default=None)
get_value(self, label, takeable=False)
get_values(self)

In [11]: s.get(1)#获取单值Out[11]: 3.0In [12]: s.get('B')Out[12]: 3.0In [13]: s.get([1,3])#获取多值Out[13]:B    3.0D    NaNdtype: float64In [14]: s.get(['B','D'])Out[14]:B    3.0D    NaNdtype: float64In [15]: s.get_value(1)#只能获取单值Out[15]: 3.0In [16]: s.get_value('B')Out[16]: 3.0In [17]: s.get_values()#获取所有值Out[17]: array([  1.,   3.,   5.,  nan,   6.,   8.])In [18]: s.get('G')#索引不存在,默认返回None,不报错
④切片

In [3]: s = pd.Series([1,3,5,np.nan,6,8],index=['A','B','C','D','E','F'])In [4]: s[:3]#获取下标为3之前的所有数据,不包含下标为3索引数据Out[4]:A    1.0B    3.0C    5.0dtype: float64In [5]: s[3:]#获取下标为3之后的所有数据,包含下标为3索引数据Out[5]:D    NaNE    6.0F    8.0dtype: float64In [6]: s[:-1]#获取所有数据Out[6]:A    1.0B    3.0C    5.0D    NaNE    6.0dtype: float64In [7]: s[-1:]#获取最后一个数据Out[7]:F    8.0dtype: float64In [8]: s[1:5:2]#获取下标为1、3索引数据Out[8]:B    3.0D    NaNdtype: float64In [10]: s[-1::-1]#逆序输出Out[10]:F    8.0E    6.0D    NaNC    5.0B    3.0A    1.0dtype: float64


Series对象运算操作
①直接赋值操作

In [1]: import pandas as pd   ...: import numpy as np   ...: s = pd.Series([1,3,5,np.nan,6,8],index=['A','B','C','D','E','F'])   ...: s.D=4   ...: s   ...:Out[1]:A    1.0B    3.0C    5.0D    4.0E    6.0F    8.0dtype: float64

②布尔运算

In [2]: s[s>3]Out[2]:C    5.0D    4.0E    6.0F    8.0dtype: float64


③标量乘法(最简单的广播)

In [3]: s*2Out[3]:A     2.0B     6.0C    10.0D     8.0E    12.0F    16.0dtype: float64


④四则运算


In [4]: s1 = pd.Series([4,5,6,7],index=['B','C','D','G'])In [6]: s1Out[6]:B    4C    5D    6G    7dtype: int64In [7]: s+s1Out[7]:A     NaNB     7.0C    10.0D    10.0E     NaNF     NaNG     NaNdtype: float64

⑤成员运算

In [8]: 'B' in sOut[8]: TrueIn [9]: 'G' not in sOut[9]: True
⑥Series对象索引的赋值就地修改

In [26]: s3.index=['A','B','C','D']In [27]: s3Out[27]:A    2.0B    4.0C    8.0D    NaNName: data, dtype: float64














0 0