python玩转数据笔记:数据结构
May 3 2016想储备点数据分析相关知识,所以抽了1天时间上了1门数据分析入门的公开课,记录一下学到的东西。
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 运算
>>> 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