纵有疾风起
人生不言弃

第3周-强大的数据结构(字典集合+scipy的数据结构)

字典与集合

定义:

list:链表,有序的项目,通过索引进行查找,使用方括号”[]”;

tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”;

dict:字典,字典是一组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序, 使用大括号”{}”;

set:集合,无序,元素只出现一次,自动去重,使用”set([])”

set和lsit可以自由转换,在删除list中多个/海量重复元素时,可以先转换成set,然后再转回list并排序(set没有排序)。此种方法不仅方便且效率较高。

scipy库

SciPy是一个基于Python的软件生态圈 它包括如NumPy Matplotlib和pandas 这样的一些核心库。

它有非常丰富强大的数据结构和函数使用起来也非常便利 。

SciPy中使用了一些Python标准的数据结构的扩展形式 比如说
– ndarrayN维数组
– Series变长字典
– 数据框DataFrame

1 ndarry

1.1创建多维数组

import numpy as np
xArray = np.array([(1,2,3),(2,3,4)])
print(xArray)

# 特殊的,零矩阵,和1矩阵
np.zero([2,3])
np.ones() 

# empty() 函数
这个函数可以创建一个没有任何具体值的 ndarray 数组

# 总之,数组的形式必须用[]中括号

2ndarray 的数据类型 与 转换
第3周-强大的数据结构(字典集合+scipy的数据结构)插图

1.2类型转换

通过 ndarray 的 astype() 方法进行强制类型转换,浮点数转换为整数时小数部分会被舍弃:

第3周-强大的数据结构(字典集合+scipy的数据结构)插图1

1.3 ndarray 的简单使用

使用 ndarray 数组可以让我们不需要使用循环就可以对列表里的元素执行操作,语法和对标量元素的操作一样,例如:
第3周-强大的数据结构(字典集合+scipy的数据结构)插图2

还有一些常用函数:

>>> x.size   #获得数组中元素的个数
>>> x.shape  #获得数组的(行数,列数)

abs()取绝对值
sqrt()计算元素平方根
sort()排序

power(a,b)计算a的b次方

# 等等,用到的时候查书

2 pandas的series(变长字典)

Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index)。

2.1生成series

1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会使用默认索引(从0到N-1)。

# 引入Series和DataFrame
In [16]: from pandas import Series,DataFrame
In [17]: import pandas as pd

In [18]: ser1 = pd.Series(range(1,5))

In [19]: ser1
Out[19]: 
0    1
1    2
2    3
3    4
dtype: int32

1.2 当要生成一个指定索引的Series 时候,可以这样:  

# 给index指定一个list
In [23]: ser2 = Series(range(4),index = ["a","b","c","d"])

In [24]: ser2
Out[24]: 
a    0
b    1
c    2
d    3
dtype: int64

1.3 也可以通过字典来创建Series对象

In [45]: sdata = {
  'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}

In [46]: ser3 = Series(sdata)
# 可以发现,用字典创建的Series是按index有序的
In [47]: ser3
Out[47]: 
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64

 在用字典生成Series的时候,也可以指定索引,当索引中值对应的字典中的值不存在的时候,则此索引的值标记为Missing,NA,并且可以通过函数(pandas.isnull,pandas.notnull)来确定哪些索引对应的值是没有的。

In [48]: states = ['California', 'Ohio', 'Oregon', 'Texas']

In [49]: ser3 = Series(sdata,index = states)

In [50]: ser3
Out[50]: 
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64
# 判断哪些值为空
In [51]: pd.isnull(ser3)
Out[51]: 
California     True
Ohio          False
Oregon        False
Texas         False
dtype: bool

In [52]: pd.notnull(ser3)
Out[52]: 
California    False
Ohio           True
Oregon         True
Texas          True
dtype: bool

2.2访问Series中的元素和索引:

# 访问索引为"a"的元素
In [25]: ser2["a"]
Out[25]: 0
# 访问索引为"a","c"的元素
In [26]: ser2[["a","c"]]
Out[26]: 
a    0
c    2
dtype: int64
# 获取所有的值
In [27]: ser2.values
Out[27]: array([0, 1, 2, 3])
# 获取所有的索引
In [28]: ser2.index
Out[28]: Index([u'a', u'b', u'c', u'd'], dtype='object')

2.3简单运算

  在pandas的Series中,会保留NumPy的数组操作(用布尔数组过滤数据,标量乘法,以及使用数学函数),并同时保持引用的使用

In [34]: ser2[ser2 > 2]
Out[34]: 
a    64
d     3
dtype: int64

In [35]: ser2 * 2
Out[35]: 
a    128
b      2
c      4
d      6
dtype: int64

In [36]: np.exp(ser2)
Out[36]: 
a    6.235149e+27
b    2.718282e+00
c    7.389056e+00
d    2.008554e+01
dtype: float64

2.4 Series的自动对齐

 Series的一个重要功能就是自动对齐(不明觉厉),看看例子就明白了。 差不多就是不同Series对象运算的时候根据其索引进行匹配计算。
 

# ser3 的内容
In [60]: ser3
Out[60]: 
Ohio      35000
Oregon    16000
Texas     71000
Utah       5000
dtype: int64
# ser4 的内容
In [61]: ser4
Out[61]: 
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
dtype: float64
# 相同索引值的元素相加
In [62]: ser3 + ser4
Out[62]: 
California         NaN
Ohio           70000.0
Oregon         32000.0
Texas         142000.0
Utah               NaN
dtype: float64

2.5命名

Series对象本身,以及索引都有一个 name 属性

In [64]: ser4.index.name = "state"

In [65]: ser4.name = "population"

In [66]: ser4
Out[66]: 
state
California        NaN
Ohio          35000.0
Oregon        16000.0
Texas         71000.0
Name: population, dtype: float64

3 pandas的dataframe ()

3.1 DataFrame 对象的构建

1 用包含等长的列表或者是NumPy数组的字典创建DataFrame对象

In [68]: import pandas as pd

In [69]: from pandas import Series,DataFrame

# 建立包含等长列表的字典类型
In [70]:  data = {
  'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],'year': [2000, 2001, 20
    ...: 02, 2001, 2002],'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
In [71]: data
Out[71]: 
{
  'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
 'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
 'year': [2000, 2001, 2002, 2001, 2002]}
# 建立DataFrame对象
In [72]: frame1 = DataFrame(data)
# 红色部分为自动生成的索引
In [73]: frame1
Out[73]: 
   pop   state  year
 1.5    Ohio  2000
 1.7    Ohio  2001
 3.6    Ohio  2002
 2.4  Nevada  2001
 2.9  Nevada  2002

在建立过程中可以指点列的顺序:

In [74]: frame1 = DataFrame(data,columns=['year', 'state', 'pop'])

In [75]: frame1
Out[75]: 
   year   state  pop
 2000    Ohio  1.5
 2001    Ohio  1.7
 2002    Ohio  3.6
 2001  Nevada  2.4
 2002  Nevada  2.9

和Series一样,DataFrame也是可以指定索引内容:

In [76]: ind = ['one', 'two', 'three', 'four', 'five']
In [77]: frame1 = DataFrame(data,index = ind)

In [78]: frame1
Out[78]: 
       pop   state  year
one    1.5    Ohio  2000
two    1.7    Ohio  2001
three  3.6    Ohio  2002
four   2.4  Nevada  2001
five   2.9  Nevada  2002

3.2 DataFrame 内容访问

从DataFrame中获取一列的结果为一个Series,可以通过以下两种方式获取:

# 以字典索引方式获取
In [100]: frame1["state"]
Out[100]: 
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object
# 以属性方式获取
In [101]: frame1.state
Out[101]: 
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object

也可以通过ix获取一行数据:

In [109]: frame1.ix["one"] # 或者是 frame1.ix[0]
Out[109]: 
pop       1.5
state    Ohio
year     2000
Name: one, dtype: object
# 获取多行数据
In [110]: frame1.ix[["tow","three","four"]]
Out[110]: 
       pop   state    year
tow    NaN     NaN     NaN
three  3.6    Ohio  2002.0
four   2.4  Nevada  2001.0
# 还可以通过默认数字行索引来获取数据
In [111]: frame1.ix[range(3)]
Out[111]: 
       pop state  year
one    1.5  Ohio  2000
two    1.7  Ohio  2001
three  3.6  Ohio  2002

获取指定行,指定列的交汇值:

In [119]: frame1["state"]
Out[119]: 
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object

In [120]: frame1["state"][0]
Out[120]: 'Ohio'

In [121]: frame1["state"]["one"]
Out[121]: 'Ohio'

3.3 DataFrame 对象的修改

  增加一列,并所有赋值为同一个值:

# 增加一列值
In [131]: frame1["debt"] = 10

In [132]: frame1
Out[132]: 
       pop   state  year  debt
one    1.5    Ohio  2000    10
two    1.7    Ohio  2001    10
three  3.6    Ohio  2002    10
four   2.4  Nevada  2001    10
five   2.9  Nevada  2002    10

# 更改一列的值
In [133]: frame1["debt"] = np.arange(5)

In [134]: frame1
Out[134]: 
       pop   state  year  debt
one    1.5    Ohio  2000     0
two    1.7    Ohio  2001     1
three  3.6    Ohio  2002     2
four   2.4  Nevada  2001     3
five   2.9  Nevada  2002     4

追加类型为Series的一列

# 判断是否为东部区
In [137]: east = (frame1.state == "Ohio")

In [138]: east
Out[138]: 
one       True
two       True
three     True
four     False
five     False
Name: state, dtype: bool
# 赋SeriesIn [139]: frame1["east"] = east

In [140]: frame1
Out[140]: 
       pop   state  year  debt   east
one    1.5    Ohio  2000     0   True
two    1.7    Ohio  2001     1   True
three  3.6    Ohio  2002     2   True
four   2.4  Nevada  2001     3  False
five   2.9  Nevada  2002     4  False

DataFrame 的行是可以命名的,同时多列也可以命名:

In [145]: frame3.columns.name = "state"

In [146]: frame3.index.name = "year"

In [147]: frame3
Out[147]: 
state  Nevada  Ohio
year               
     2.9   3.6
     2.4   1.7
     NaN   1.5

原文链接:https://lookme.blog.csdn.net/article/details/72865551

本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。

未经允许不得转载:起风网 » 第3周-强大的数据结构(字典集合+scipy的数据结构)
分享到: 生成海报

评论 抢沙发

评论前必须登录!

立即登录