利用Python进行数据分析——pandas入门(4)

2、pandas入门

  pandas所包含的数据结构和数据处理工具的设计使得在Python中进行数据清洗和分析非常快捷。pandas支持大部分NumPy语言风格的数组计算,尤其是数组函数以及没有for循环的各种数据处理。

2.1 pandas数据结构介绍

  pandas中需要熟悉两个常用的工具数据结构:SeriesDataFrame

2.1.1 Series

  Series是一种一维的数组型对象,它包含了一个值序列(与NumPy中的类型相似),并且包含了数据标签,称为索引(index)。

In [1]: import pandas as pd

In [2]: obj = pd.Series([3,4,-1,3])

In [3]: obj
Out[3]:
0    3
1    4
2   -1
3    3
dtype: int64

In [4]: obj.values
Out[4]: array([ 3,  4, -1,  3], dtype=int64)

In [5]: obj.index
Out[5]: RangeIndex(start=0, stop=4, step=1)

  可以自己创建索引序列:

In [6]: obj2 = pd.Series([3,6,-2,8],index=['v','s','q','sd'])

In [7]: obj2
Out[7]:
v     3
s     6
q    -2
sd    8
dtype: int64

In [8]: obj2.index
Out[8]: Index(['v', 's', 'q', 'sd'], dtype='object')

  可以使用和numpy相同的操作:

In [9]: obj2[obj2 > 0]
Out[9]:
v     3
s     6
sd    8
dtype: int64

In [10]: obj2 * 2
Out[10]:
v      6
s     12
q     -4
sd    16
dtype: int64

In [11]: 'b' in obj2
Out[11]: False

In [12]: 's' in obj2
Out[12]: True


  从另一个角度考虑Series,可以认为它是一个长度固定且有序的字典,因为它将索引值和数据值按位置配对。如果已经有数据包含在Python字典中,你可以使用字典生成一个Series

In [13]: sdata = {'Ohio' : 2344, 'Relx' : 2467, 'Bob' : 9023}

In [14]: sdata
Out[14]: {'Bob': 9023, 'Ohio': 2344, 'Relx': 2467}

In [15]: obj3 = pd.Series(sdata)

In [16]: obj3
Out[16]:
Bob     9023
Ohio    2344
Relx    2467
dtype: int64

  把字典传递给Series构造函数时,产生的Series的索引将是排序好的字典键。

  pandas中使用isnullnotnull函数来检查缺失数据:

In [17]: states = ['Caly', 'Ohio', 'Relx', 'Bob']

In [18]: obj4 = pd.Series(sdata, index=states)

In [19]: obj4
Out[19]:
Caly       NaN
Ohio    2344.0
Relx    2467.0
Bob     9023.0
dtype: float64

In [20]: pd.isnull(obj4) # 用来检验数据是否有缺失
Out[20]:
Caly     True # 有缺失
Ohio    False
Relx    False
Bob     False
dtype: bool

In [21]: pd.notnull(obj4) # 用来检验数据是否没有缺失
Out[21]:
Caly    False
Ohio     True  # True说明  没有缺失
Relx     True
Bob      True
dtype: bool

  Series对象自身和其索引都有name属性,这个特性与pandas其他重要功能集成在一起:

In [22]: obj4.name

In [23]: obj4.name = 'popluation'

In [24]: obj4.index.name = 'state'

In [25]: obj4
Out[25]:
state
Caly       NaN
Ohio    2344.0
Relx    2467.0
Bob     9023.0
Name: popluation, dtype: float64

  Series的索引可以通过按位置赋值的方式进行改变:

In [26]: obj
Out[26]:
0    3
1    4
2   -1
3    3
dtype: int64

In [27]: obj.index = ['Bob', 'Steve', 'Lily', 'Cindy']

In [28]: obj
Out[28]:
Bob      3
Steve    4
Lily    -1
Cindy    3
dtype: int64

2.1.2 DataFrame

  DataFrame表示的是矩阵的数据表,它包含已排序的列集合,每一列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被视为一个共享相同索引的Series的字典。在DataFrame中,数据被存储为一个以上的二维块,而不是列表、字典或其他一维数组的集合。

  有多种方式可以构建DataFrame,其中最常用的方式是利用包含等长度列表或NumPy数组的字典来形成DataFrame

In [31]: data = {'state' : ['Ohio', 'Nevada', 'Amenda', 'Lily'],'year' : [2000, 1999, 20
    ...: 02, 1995], 'pop' : [1.3, 1.2, 1.7, 1.9]}

In [32]: frame = pd.DataFrame(data)

In [33]: frame
Out[33]:
   pop   state  year
0  1.3    Ohio  2000
1  1.2  Nevada  1999
2  1.7  Amenda  2002
3  1.9    Lily  1995

In [34]: frame = pd.DataFrame(data, columns = ['year', 'pop', 'state']) # 按照要求分配索引

In [35]: frame
Out[35]:
   year  pop   state
0  2000  1.3    Ohio
1  1999  1.2  Nevada
2  2002  1.7  Amenda
3  1995  1.9    Lily

  对于大型DataFrame, head方法将会只选出头部的五行:

In [36]: frame.head()
Out[36]:
   year  pop   state
0  2000  1.3    Ohio
1  1999  1.2  Nevada
2  2002  1.7  Amenda
3  1995  1.9    Lily

  DataFrame中的一列,可以按字典型标记或属性那样检索为Series

In [37]: frame['year']
Out[37]:
0    2000
1    1999
2    2002
3    1995
Name: year, dtype: int64

In [38]: frame.state
Out[38]:
0      Ohio
1    Nevada
2    Amenda
3      Lily
Name: state, dtype: object

  转置:

data = {
    'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
    'year':[2000,2001,2002,2001,2002],
    'pop':[1.5,1.7,3.6,2.4,2.9]
}
frame = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print(frame)
print(frame.T)
'''
 pop   state  year
a  1.5    Ohio  2000
b  1.7    Ohio  2001
c  3.6    Ohio  2002
d  2.4  Nevada  2001
e  2.9  Nevada  2002
          a     b     c       d       e
pop     1.5   1.7   3.6     2.4     2.9
state  Ohio  Ohio  Ohio  Nevada  Nevada
year   2000  2001  2002    2001    2002
'''

  和Series类似,DataFramevalues属性会将包含在DataFrame中的数据以二维ndarray的形式返回:

In [39]: frame
Out[39]:
   year  pop   state
0  2000  1.3    Ohio
1  1999  1.2  Nevada
2  2002  1.7  Amenda
3  1995  1.9    Lily

In [40]: frame.values
Out[40]:
array([[2000, 1.3, 'Ohio'],
       [1999, 1.2, 'Nevada'],
       [2002, 1.7, 'Amenda'],
       [1995, 1.9, 'Lily']], dtype=object)

2.1.3 索引对象

  pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称或标签)。索引对象是不可变的,因此用户是无法修改索引对象的:

In [41]: obj = pd.Series(range(3), index = ['a', 'b', 'c'])

In [42]: index = obj.index

In [43]: index
Out[43]: Index(['a', 'b', 'c'], dtype='object')

In [44]: index[1:]
Out[44]: Index(['b', 'c'], dtype='object')

In [45]: index[1]
Out[45]: 'b'

  与Python集合不同,pandas索引对象可以包含重复标签:

In [47]: labels = pd.Index(['a', 'a', 'a', 'v', 'c'])

In [48]: labels
Out[48]: Index(['a', 'a', 'a', 'v', 'c'], dtype='object')

  一些索引对象的方法和属性
利用Python进行数据分析——pandas入门(4)_第1张图片

你可能感兴趣的:(Python)