数据准备
在python当中,使用numpy和pandas处理数据。首先介绍一下如何使用这两个库。
numpy
numpy可以看作是一个更厉害与牛逼的数组
import numpy as np
# 最基础的ndarray
# 常用的参数
np.array(object, dtype = None, ndmin = 0)
dtype: 数据类型
ndmin: 最小维度
# 构建一个ndarray
a = np.array([1, 2, 3, 4])
print(a, type(a))
结果为 [1 2 3 4] <class 'numpy.ndarray'>
b = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
print(b, b.shape, type(b))
print(b.size, b.dtype)
结果为
[[1 2 3 4]
[5 6 7 8]] (2, 4) <class 'numpy.ndarray'>
8 int64
b.shape :b的‘形状’,表示各维度的大小
b.size :b的元素个数,shape中的m*n
b.dtype :b的数据类型
numpy提供reshape方法来改变ndarray的维度
c = b.reshape(4, 2)
print(b)
print(c)
结果为
[[1 2 3 4]
[5 6 7 8]]
[[1 2]
[3 4]
[5 6]
[7 8]]
可以看到,首先两个ndarray的size大小相等(都为8),然后是将b的两个1维数组拼在一起后展开再重新组合得到c,一个1维长度为2,2维长度为4的ndarray。
创建数组
# 创建一个空的数组(维度为(3,2)),数据类型为int
x = np.empty((3, 2), dtype = int)
# 创建一个数据全为0的数组(维度为(4,2)),数据类型默认为float
x = np.zeros((4, 2))
# 创建一个维度为(3,2),数据用pi填充的数组
x = np.full((3, 2), np.pi)
# 创建一个全为1的矩阵, 数据类型默认为float
x = np.ones(5)
# 创建一个起始值为10,终止值为20(娶不到20),步长为2的数组
x = np.arange(10,20,2)
数组切片
# 首先建立一个0到9的数组
a = np.array(0,10)
# 从第3个索引到第7个索引,步长为2
b = a[3:7:2]
# b = [3 5] 从索引号为3的开始,以步长为2开始找,不包含第7个索引号的内容
c = a[3:] # 23456789 后省略代表到最后一个(包含最后一个)
d = a[:7] # 0123456 前省略代表从0索引开始,不包含最后一个
“”“
多维切片,就是将每个1维数组先看成一个元素
”“”
a = np.array([[1,2,3], [4,5,6], [7,8,9],[9,10,11]])
b = a[1:3]
print(b, b.shape)
结果为
[[4 5 6]
[7 8 9]] (2, 3) 取到第1,2两个索引号的内容
c = a[:,1:3] # 逗号前为行,逗号后为列
print(c, c.shape)
结果为
[[ 2 3]
[ 5 6]
[ 8 9]
[10 11]] (4, 2) 行全取,列从第一列开始取
pandas
那pandas就是一个厉害且牛逼的表格库
建立一个简单的数据与索引的关系
import pandas as pd
# Series类似于字典
name = ['张三', '李四', '王五', '赵六']
a = pd.Series(name, index=['1', '2', '3', '4'])
print(a, a.shape)
结果为
1 张三
2 李四
3 王五
4 赵六
dtype: object (4,) 实现了数据11对应的一个简易表格
# 索引
print(a['1']) # 张三
Dataframe就是将多个Series组合起来,形成一个大表格,每行的内容都是由同样index的Series中的内容组合的
data = {
"name": ['张三', '李四', '王5'],
"habit": ['睡觉', '打牌', '泡妞']
}
df = pd.DataFrame(data)
print(df)
结果为
name habit
0 张三 睡觉
1 李四 打牌
2 王5 泡妞
可以看到同样为一一对应的,这样创建需要二者长度一致
# 改变索引名字
df = pd.DataFrame(data, index=['老大', '老二', '老三'])
print(df)
name habit
老大 张三 睡觉
老二 李四 打牌
老三 王5 泡妞