python-数据分析模块numpy-pandas

numpy 模块

numpy属于第三方库,需要下载安装。

numpy库有两个作用:

  1. 区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型;
  2. 计算速度快

创建矩阵方法:

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数据分析的核心模块,它有五大功能:

  1. 支持文件存取操作,数据库(sql)、html、json、pickle、csv(txt、excel)、sas、stata、hdf等。
  2. 支持增删改查、切片、高阶函数、分组聚合等单表操作,以及和dict、list的互相转换。
  3. 支持多表拼接合并操作。
  4. 支持简单的绘图操作。
  5. 支持简单统计分析操作。

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
原文地址:https://www.cnblogs.com/raynduan/p/11079172.html