数据分析(四)

  • 2019 年 10 月 6 日
  • 筆記

数组的拼接

在numpy中使用+号是不能进行拼接的。

其次拼接分为竖直拼接和水平拼接。

实例:

import numpy as np

# 创建一个二维数组attr1

attr1 = np.array([[1,2,3],[4,5,6]])

# 创建一个二维数组attr2

attr2 = np.array([[7,8,9],[10,11,12]])

# 竖直拼接,参数为元组

print('***竖直拼接***')

attr3 = np.vstack((attr1,attr2))

print(attr3)

# 水平拼接

print('***水平拼接***')

attr4 = np.hstack((attr1,attr2))

print(attr4)

输出:

***竖直拼接***

[[ 1 2 3]

[ 4 5 6]

[ 7 8 9]

[10 11 12]]

***水平拼接***

[[ 1 2 3 7 8 9]

[ 4 5 6 10 11 12]]

行列的交换

在处理数据的时候,有可能会把行和列交换的情况。

实例:

attr5 = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])

# 行交换,交换第4行和第2行

print('***行交换***')

attr5[[1,3],:] = attr5[[3,1],:]

print(attr5)

attr6 = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])

# 列交换,交换第2列和第4列

print('***列交换***')

attr6[:,[1,3]] = attr6[:,[3,1]]

print(attr6)

输出:

***行交换***

[[ 1 2 3]

[11 22 33]

[ 7 8 9]

[ 4 5 6]]

***列交换***

[[ 2 1 3]

[ 5 4 6]

[ 8 7 9]

[22 11 33]]

其他创建数组的方式和计算

实例:

# 全为0的5行6列的数组

zeros_data = np.zeros((5,6)).astype(int)

# 全为1的5行6列的数组

ones_data = np.ones((5,6)).astype(int)

# 创建一个5行5列的,对角线为1的数组

a = np.eye(5)

# 生成首位是0,末位是10,含5个数的等差数列

a = np.linspace(0,10,5)

# 首位是10的0次方,末位是10的2次方,含10个数的等比数列。

a = np.logspace(0,2,10)

# 获取数组的最大值和最小值

attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])

# 获取最大值

print(np.max(attr))

# 获取最小值

print(np.min(attr))

# 获取最大值和最小值的位置

attr = np.array([[1,2,3],[4,5,6],[7,8,9],[11,22,33]])

# 查找每一行中最大的数字的位置

b = np.argmax(attr,axis=0)

# 查找每一行中最小的数字的位置

c = np.argmin(attr,axis = 0)

# 查找每一列中最大的数字的位置

b1 = np.argmax(attr,axis=1)

# 查找每一列中最小的数字的位置

c1 = np.argmin(attr,axis=1)

# 平均值

d = np.mean(attr,axis=0)

还有很多,求和sum,取中值median(加轴就取轴的,不加取全部),方差var(),标准差std(),极差ptp(),中值median等等。

还有:

numpy随机数

# 创建一个整数10~30的3行4列

t1 = np.random.randint(10,30,(3,4))

# 随机种子

# 让我们随机的值下次再运行还是这些值

# 1只是一个种子。可以写其他值

np.random.seed(1)

t2 = np.random.randint(0,30,(3,4))

# 同时还可以生成服从正态分布或者均匀分布的随机数

# rand,randn,uniform,normal也都可以自己去了解下。

numpy中的copy

a = b这样赋值是相互影响的。

a = b.copy(),a和b不相互影响。

这里和基础里的深浅拷贝是一个道理。

numpy中的nan和inf

1)

nan:在之前0/0会显示nan,其实nan表示不是一个数字

inf:inf表示正无穷,-inf表示负无穷,当数据不对的时候(比如1/0)就会出现这个值

2)

两个nan是不相等的

np.nan == np.nan # 会返回False

3)

# 计算数组中nan的个数

# 假如a中有nan值,我们可以找出这个值的个数

# count_nonzero统计非0数值的个数,参数可以指定值

np.count_nonzero(a!=a)

或者

np.count_nonzero(np.isnan(a))

4)

nan和其他任意值计算都是nan

5)

当我们计算的时候需要把nan替换成0或者均值,或者中值。

6)实例替换nan值

# 生成一个数组

t = np.arange(12).reshape((3,4)).astype('float')

# 将第3行的第2列和后面的替换成nan

t[2,1:] = np.nan

# 循环行

for i in range(t.shape[0]):

# 获取当前行

temp_col = t[i,:]

# 计算nan的数量

num_nan = np.count_nonzero(np.isnan(t))

# 不等于0表示存在nan值

if num_nan != 0:

temp_col[np.isnan(temp_col)] = 0

print(t)

pandas基础

numpy只能处理数值类型,而pandas是再numpy的基础上还能够处理字符串等其他类型。

1.1、安装模块:pip install pandas

实例:

# 导入模块

import pandas as pd

# 创建一个一维数组

attr = pd.Series([1,2,3,4,5,6,7,8,9])

print(attr)‘

会输出:

0 1

1 2

2 3

3 4

4 5

5 6

6 7

7 8

8 9

dtype: int64

# 第一列表示索引,第二列才是我们的数据,同时还输出了dtype,不同的电脑可能是int32。

我们可以指定索引:

attr1 = pd.Series([1,2,3,4,5,6,7,8,9],index = range(10,19))

print(attr1)

会输出:

10 1

11 2

12 3

13 4

14 5

15 6

16 7

17 8

18 9

dtype: int64

# 此时,索引就是我们设定的值。值得注意的是我们的索引长度需要和我们数据的长度相同。

# 创建的另一种方式

# 定义一个字典

data_dict = {'name':'张三','age':20,'sex':'男'}

attr3 = pd.Series(data_dict)

会输出:

name 张三

age 20

sex 男

dtype: object

取值直接:

attr3['name'],也可以attr3[0]

获取:取前2个

attr3[:2]

获取不连续的

attr3[[0,2]]

查找值同样可以

print(attr[attr>1])

print(attr[attr<5])

print(attr[attr==3])

查看索引:

attr.index

是可以迭代的。需要循环查看。

查看某些索引:

attr.index[:1]

查看值

attr.values。

切片,遍历都是由可以的。

很多功能和numpy中大部分都相同。这里就不在一一阐述。

pandas读取外部数据

数据准备:

创建一个csv文件,写上:

姓名,年龄,性别,身高

张三,18,男,165

李四,19,男,145

王五,20,女,178

赵六,21,女,170

python贼6,88,不知,188

实例:

# 导入模块

import pandas as pd

# 读取csv文件

read_data = pd.read_csv('demo2.csv')

print(read_data)

姓名 年龄 性别 身高

0 张三 18 男 165

1 李四 19 男 145

2 王五 20 女 178

3 赵六 21 女 170

4 python贼6 88 不知 188

# 这个文件需要放在当前文件夹下,不能含有路径。

# 如果报错:'utf-8' codec can't decode byte 0xd0 in position 0: invalid con

# 找到csv文件–>右键–>打开方式–>记事本

# 打开记事本之后,选择头部菜单的“文件–>另存为”,可以看到文件的默认编码格式为ANSI,修改为utf-8即可。

当然,pandas不仅仅可以读取csv文件,也可以读取txt文件。

还有:read_excel(),read_json(),read_html(),read_sql(),等等。

这里就不一一介绍,需要的时候百度一下,都是一样的。

下一篇文章会说读取mongodb数据库。