python-数据分析模块numpy-pandas
目录
numpy 模块
numpy属于第三方库,需要下载安装。
numpy库有两个作用:
- 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型;
- 计算速度快
创建矩阵方法:
import numpy as np #np是约定俗称将numpy简写
np.array() # 创建矩阵
- 一维矩阵
一维矩阵就相当于列表
arr =np.array([1,2,3])
print(arr)
[1 2 3]
- 二维矩阵
arr = np.array([[1,2,3],[1,2,3]])
print(arr)
[[1 2 3]
[1 2 3]]
- 三维矩阵
arr = np.array([[[1,2,3],[1,2,3]],[[1,2,3],[1,2,3]]])
print(arr)
[[[1 2 3]
[1 2 3]]
[[1 2 3]
[1 2 3]]]
获取矩阵的行列数
arr = np.array([[12,23,4],[12,3,4]])
print(arr)
[[12 23 4]
[12 3 4]]
print(arr.shape) #获取矩阵的行和列
(2, 3)
print(arr.shape[0]) # 获取矩阵的行
2
print(arr.shape[1]) # 获取矩阵的列
3
切割矩阵
切分矩阵类似于列表的切割,但是与列表的切割不同的是,矩阵的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。
arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
print(arr)
print(arr[:,:]) #取所有的元素,:默认所有
print(arr[0,:]) #取第一整行
print(arr[:,0]) # 取第一列
print(arr[1,2]) # 取第二行第三列的值
print(arr[arr>10]) # 取大于10的元素
[[12 23 4]
[10 3 4]
[ 2 4 5]]
**************************************************
[[12 23 4]
[10 3 4]
[ 2 4 5]] #取所有的元素,:默认所有
**************************************************
[12 23 4] #取第一整行
**************************************************
[12 10 2] # 取第一列
**************************************************
4 # 取第二行第三列的值
**************************************************
[12 23] # 取大于10的元素
矩阵元素替换
矩阵也是一个可变类型的数据,如果对矩阵进行替换操作,会修改矩阵的元素。
arr = np.array([[12,23,4],[10,3,4],[2,4,5]])
print(arr)
arr[1,:]=0 # 取值第二行,并让第二行的元素都为0
print(arr)
arr[arr>10] =0 # 取大于10的值,并让其为0
print(arr)
[[12 23 4]
[10 3 4]
[ 2 4 5]]
**************************************************
[[12 23 4]
[ 0 0 0] # 取值第二行,并让第二行的元素都为0
[ 2 4 5]]
**************************************************
[[ 0 0 4] # 取大于10的值,并让其为0
[10 3 4]
[ 2 4 5]]
矩阵的合并
arr1 = np.array([[12,23,4],[10,3,4],[2,4,5]])
arr2 = np.array([[11,33,6],[11,7,6],[2,4,5]])
print(arr1)
print('*'*50)
print(arr2)
print('*'*50)
print(np.hstack((arr1,arr2))) # 合并两个矩阵的行,矩阵应该有相同的行 h表示水平
print(np.vstack((arr1,arr2))) #合并两个矩阵的列,矩阵应该有相同的列,v表示垂直
print(np.concatenate((arr1,arr2),axis=0)) #axis=0 表示合并两个矩阵的列,矩阵应该有相同的列,并且axis默认为0
print(np.concatenate((arr1,arr2),axis=1)) #axis=1 表示合并两个矩阵的行,矩阵应该有相同的行,axis默认为0
[[12 23 4]
[10 3 4]
[ 2 4 5]]
**************************************************
[[11 33 6]
[11 7 6]
[ 2 4 5]]
**************************************************
[[12 23 4 11 33 6]
[10 3 4 11 7 6]
[ 2 4 5 2 4 5]] # 合并两个矩阵的行,矩阵应该有相同的行 h表示水平
**************************************************
[[12 23 4]
[10 3 4]
[ 2 4 5]
[11 33 6]
[11 7 6]
[ 2 4 5]]
**************************************************
[[12 23 4]
[10 3 4]
[ 2 4 5]
[11 33 6]
[11 7 6]
[ 2 4 5]] #axis=0 表示合并两个矩阵的列,矩阵应该有相同的列,并且axis默认为0
**************************************************
[[12 23 4 11 33 6]
[10 3 4 11 7 6]
[ 2 4 5 2 4 5]] #axis=1 表示合并两个矩阵的行,矩阵应该有相同的行,axis默认为0
通过函数创建矩阵
-
arange
arr =np.arange(1,10) #创建1-9 的数字 一维矩阵 print(arr) [1 2 3 4 5 6 7 8 9]
-
linspace/loqspace
print(np.linspace(0,20,6)) # 等差数列 取头也取尾,取6个数,并且前两个数之和等于后一个数 [ 0. 4. 8. 12. 16. 20.] print(np.logspace(0,20,6)) # 等比数列 取6个数 [1.e+00 1.e+04 1.e+08 1.e+12 1.e+16 1.e+20]
-
zeros/ones/eye/empty
print(np.zeros((3,4))) # 创建 3*4全是0的矩阵 [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] print(np.ones((3,4))) # 创建3*4 全是1的矩阵 [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] print(np.eye(3)) # 创建3个主元的单位矩阵 [[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]] print(np.empty((4,4))) # 创建一个4*4的随机矩阵,里面的元素是随机生成的 [[6.23042070e-307 1.42417221e-306 1.37961641e-306 1.24610383e-306] [1.69118108e-306 8.06632139e-308 1.20160711e-306 1.69119330e-306] [1.78019082e-306 1.78020984e-306 6.23053954e-307 8.06635110e-308] [7.56603881e-307 1.78019082e-306 1.78020984e-306 1.60218627e-306]]
矩阵的运算
+ 两个矩阵对应元素相加
- 两个矩阵对应元素相减
* 两个矩阵对应元素相乘
/ 两个矩阵对应元素相除,如果都是整数则取商
% 两个矩阵对应元素相除后取余数
**n 单个矩阵每个元素都取n次方,如**2:每个元素都取平方
pandas模块
pandas 是python数据分析的核心模块,它有五大功能:
- 支持文件存取操作,数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
- 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
- 支持多表拼接合并操作。
- 支持简单的绘图操作。
- 支持简单统计分析操作。
series (一维列表)
import numpy as np
import pandas as pd
arr = np.arange(1,10)
print(arr)
s= pd.Series(arr)
print(s)
[1 2 3 4 5 6 7 8 9]
0 1
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 9
dtype: int32
DataFrame
- 创建数据列表
import pandas as pd
import numpy as np
# 定义索引(行)的值
dates = pd.date_range('2019-01-01',periods=6)
# 定义矩阵内的值
np.random.seed(1)
arr = 10*np.random.randn(6,4)
# 进行数据表的合并,column--队列 ,表示列
df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])
print(df)
c1 c2 c3 c4
2019-01-01 16.243454 -6.117564 -5.281718 -10.729686
2019-01-02 8.654076 -23.015387 17.448118 -7.612069
2019-01-03 3.190391 -2.493704 14.621079 -20.601407
2019-01-04 -3.224172 -3.840544 11.337694 -10.998913
2019-01-05 -1.724282 -8.778584 0.422137 5.828152
2019-01-06 -11.006192 11.447237 9.015907 5.024943
-
使用pandas读取字典形式的数据(数组的长度必须相同)
df2 = pd.DataFrame({'a':1,'b':[2,3],'c':np.arange(2),'d':'hello'}) print(df2) a b c d 0 1 2 0 hello 1 1 3 1 hello
DataFrame属性
dtype 查看数据类型
index 查看行序列或者索引
columns 查看各列的标签
values 查看数据框内的数据,也即不含表头索引的数据
describe 查看数据每一列的极值,均值,中位数,只可用于数值型数据
transpose 转置,也可用T来操作
sort_index 排序,可按行或列index排序输出
sort_values 按数据值来排序
df = pd.DataFrame(arr,index=dates,columns=['c1','c2','c3','c4'])
print(df.dtypes)
print(df.index)
print(df.columns)
print(df.values)
# 查看类型
c1 float64
c2 float64
c3 float64
c4 float64
dtype: object
# 查看索引项
DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
'2019-01-05', '2019-01-06'],
dtype='datetime64[ns]', freq='D')
#查看列
Index(['c1', 'c2', 'c3', 'c4'], dtype='object')
# 查看值
[[ 16.24345364 -6.11756414 -5.28171752 -10.72968622]
[ 8.65407629 -23.01538697 17.44811764 -7.61206901]
[ 3.19039096 -2.49370375 14.62107937 -20.60140709]
[ -3.22417204 -3.84054355 11.33769442 -10.99891267]
[ -1.72428208 -8.77858418 0.42213747 5.82815214]
[-11.00619177 11.4472371 9.01590721 5.02494339]]
查看 每一列的极值,均值,中位数
print(df.describe())
c1 c2 c3 c4
count 6.000000 6.000000 6.000000 6.000000
mean 2.022213 -5.466424 7.927203 -6.514830
std 9.580084 11.107772 8.707171 10.227641
min -11.006192 -23.015387 -5.281718 -20.601407
25% -2.849200 -8.113329 2.570580 -10.931606
50% 0.733054 -4.979054 10.176801 -9.170878
75% 7.288155 -2.830414 13.800233 1.865690
max 16.243454 11.447237 17.448118 5.828152
DataFrame取值
print(df['c2']) # 按列取值
2019-01-01 -6.117564
2019-01-02 -23.015387
2019-01-03 -2.493704
2019-01-04 -3.840544
2019-01-05 -8.778584
2019-01-06 11.447237
Freq: D, Name: c2, dtype: float64
print(df[0:2]) #取第一行和第二行
c1 c2 c3 c4
2019-01-01 16.243454 -6.117564 -5.281718 -10.729686
2019-01-02 8.654076 -23.015387 17.448118 -7.612069
-
loc/iloc 自定义取值
print(df.loc['2019-01-01':'2019-01-03']) # 通过自定义的行标签选择数据 c1 c2 c3 c4 2019-01-01 16.243454 -6.117564 -5.281718 -10.729686 2019-01-02 8.654076 -23.015387 17.448118 -7.612069 2019-01-03 3.190391 -2.493704 14.621079 -20.601407
print(df.iloc[2,1]) # 通过索引取值 == df.values[2,1] -2.493703754774101
print(df.iloc[1:4,1:4]) # 行:取第二行到第四行 ; 列:取第二列到第四列 c2 c3 c4 2019-01-02 -23.015387 17.448118 -7.612069 2019-01-03 -2.493704 14.621079 -20.601407 2019-01-04 -3.840544 11.337694 -10.998913
-
使用逻辑判断取值
print(df[df['c1']>0]) # df['c1']>0 取c1列里面大于0的值 c1 c2 c3 c4 2019-01-01 16.243454 -6.117564 -5.281718 -10.729686 2019-01-02 8.654076 -23.015387 17.448118 -7.612069 2019-01-03 3.190391 -2.493704 14.621079 -20.601407
读取CSV文件
from io import StringIO
import pandas as pd
test_data = '''
5.1,,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,,0.2
7.0,3.2,4.7,1.4
6.4,3.2,4.5,1.5
6.9,3.1,4.9,
,,,
'''
test_data = StringIO(test_data) # 将数据写入内存
df = pd.read_csv(test_data)
df.columns =['c1','c2','c3','c4']
print(df)
c1 c2 c3 c4
0 4.9 3.0 1.4 0.2
1 4.7 3.2 NaN 0.2
2 7.0 3.2 4.7 1.4
3 6.4 3.2 4.5 1.5
4 6.9 3.1 4.9 NaN
5 NaN NaN NaN NaN
处理丢失数据
print(df.isnull())
print(df.isnull().sum()) # 通过isnull()方法后使用sum()方法即可获得该数据集某个特征含有多少个缺失值。
c1 c2 c3 c4
0 False False False False
1 False False True False
2 False False False False
3 False False False False
4 False False False True
5 True True True True
c1 1
c2 1
c3 2
c4 2
dtype: int64
print(df.dropna(axis=0)) #axis=0会删除有Nan值的行
c1 c2 c3 c4
0 4.9 3.0 1.4 0.2
2 7.0 3.2 4.7 1.4
3 6.4 3.2 4.5 1.5
print(df.dropna(axis=1)) #axis=1会删除有Nan值的列
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4, 5]
print(df.dropna(how='all')) #删除全为NaN值得行或列
c1 c2 c3 c4
0 4.9 3.0 1.4 0.2
1 4.7 3.2 NaN 0.2
2 7.0 3.2 4.7 1.4
3 6.4 3.2 4.5 1.5
4 6.9 3.1 4.9 NaN