跬步 On Coding

python玩转数据笔记:数据结构

想储备点数据分析相关知识,所以抽了1天时间上了1门数据分析入门的公开课,记录一下学到的东西。

python玩转数据

ndarray 多维数组

>>> import numpy as np
>>> np.ones((3,4)) # 自动生成3*4的二维数组,全为1
array([[ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.],
       [ 1.,  1.,  1.,  1.]])
>>> np.array([[1,2], [3,4]])
array([[1, 2],
       [3, 4]])
>>> np.zeros((1,2)) # 生成全为0
array([[ 0.,  0.]])
>>> np.arange(1,10,1) # 类似于range生成列表
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

ndarray

ndarray 运算

>>> aarr = np.array([[2,2], [3,3]])
>>> barr = np.array([[3,4], [5,6]])
>>> aarr * barr # 直接对同位置的进行运算,+ - * / % +=等
array([[ 6,  8],
       [15, 18]])
>>> barr > 5 # bool运算
array([[False, False],
       [False,  True]], dtype=bool)
>>> barr.shape # 获取数组行列数结构
(2, 2)
>>> barr.reshape(1,4) # 重排数据结构
array([[3, 4, 5, 6]])
>>> barr.sum() # 算和
18
>>> barr.sum(axis=0) # 算列的和
array([ 8, 10])
>>> barr
array([[3, 4],
       [5, 6]])
>>> barr.sum(axis=1) # 算行的和 axis 0 纵轴 1 横轴
array([ 7, 11])
>>> c = np.array([[3,4], [5,6]])
>>> np.where(c > 5, aarr, barr) # 筛选组合,判断c的同位置元素如果大于5则选aarr同位置的,否则选barr的
array([[3, 4],
       [5, 3]])
>>> def func(i, j):
...     return (i+1) * (j+1)
...
>>> np.fromfunction(func, (9,9)) # 通过1个函数来创建数组,第二个参数为数组的行与列数,传给func的参数行列的索引
array([[  1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.],
       [  2.,   4.,   6.,   8.,  10.,  12.,  14.,  16.,  18.],
       [  3.,   6.,   9.,  12.,  15.,  18.,  21.,  24.,  27.],
       [  4.,   8.,  12.,  16.,  20.,  24.,  28.,  32.,  36.],
       [  5.,  10.,  15.,  20.,  25.,  30.,  35.,  40.,  45.],
       [  6.,  12.,  18.,  24.,  30.,  36.,  42.,  48.,  54.],
       [  7.,  14.,  21.,  28.,  35.,  42.,  49.,  56.,  63.],
       [  8.,  16.,  24.,  32.,  40.,  48.,  56.,  64.,  72.],
       [  9.,  18.,  27.,  36.,  45.,  54.,  63.,  72.,  81.]])
>>> np.add(aarr, barr) # ufunc的数组+
array([[5, 6],
       [8, 9]])
>>> np.add.accumulate([1,2,3]) # reduce的方式对数组求和,并返回求和后的新的数组
array([1, 3, 6])

Series 列 有序字段

>>> import pandas as pd
>>> pd.Series([1,2.0,'a']) # 自动增加索引,类似与字典的key-value结构
0    1
1    2
2    a
dtype: object
>>> aser = pd.Series([1,2,3], index=['a', 'b', 'c']) # 自定义索引名称
>>> aser
a    1
b    2
c    3
dtype: int64
>>> aser.index
Index([u'a', u'b', u'c'], dtype='object') # 获取Series的索引
>>> aser.values
array([1, 2, 3]) # 获取Series的值,返回数组对象
>>> aser['b'] # 通过索引取值
2
>>> aser * 2 # 运算,可类比ndarray的运算
a    2
b    4
c    6
dtype: int64
>>> import numpy as np
>>> np.exp(aser) # 计算自然对数的n次方
a     2.718282
b     7.389056
c    20.085537
dtype: float64
>>> data = {'a':1, 'b':2}
>>> index = ['a', 'b', 'c'] # 数据对齐,如果没有对应索引的数据,自动填充NaN
>>> bser = pd.Series(data, index=index)
>>> bser
a    1.0
b    2.0
c    NaN
dtype: float64
>>> pd.isnull(bser) # 判断是否有NaN元素,返回一个新的结果Series
a    False
b    False
c     True
dtype: bool
>>> cser = pd.Series({'a':2,'b':5,'d':10})
>>> bser + cser # 运算时如果有不相称的索引也会对齐
a    3.0
b    7.0
c    NaN
d    NaN
dtype: float64
>>> aser.name # 名称属性,分别对应Series的名称与索引名称
>>> aser.index.name
>>> aser.name = 'names'
>>> aser.index.name = 'col'
>>> aser
col
a    1
b    2
c    3
Name: names, dtype: int64

DataFrame 数据帧 表

>>> data = {'col1': [1,2,3], 'col2': [3,4,5]}
>>> adf = pd.DataFrame(data)
>>> adf
   col1  col2
0     1     3
1     2     4
2     3     5
>>> adf['col1'] # 通过列名获取单列数据,返回Series对象
0    1
1    2
2    3
Name: col1, dtype: int64
>>> adf.col1 # . 也可以用
0    1
1    2
2    3
Name: col1, dtype: int64
>>> adf.ix[0] # 通过索引获取一行数据,返回Series
col1    1
col2    3
Name: 0, dtype: int64
>>> adf.col1 = 'admin' # 重写一列的值
>>> adf
    col1  col2
0  admin     3
1  admin     4
2  admin     5
>>> adf['col1'] = [10,9,8]
>>> adf
   col1  col2
0    10     3
1     9     4
2     8     5
>>> del adf['col1'] # 删除一列
>>> adf
   col2
0     3
1     4
2     5
>>> adf.index.name = 'index' # 索引名
>>> adf
       col2
index      
0         3
1         4
2         5