python15(数值计算扩展numpy和数据分析pandas)

本文详细介绍了Python中的数值计算扩展numpy和数据分析库pandas的使用。从numpy的基础概念、数组操作到数据读取,再到pandas的Series和DataFrame操作,包括数据读取、分组聚合、字符串操作等,并通过实际案例展示了数据分析的实践应用。
摘要由CSDN通过智能技术生成

1.numpy

1.numpy基础概念
什么numpy?
快速、方便的科学计算基础库(主要是对数值的计算,多维数组的运算);
Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))
2.数组的操作
list ====== 特殊的数组
数组和列表的区别:
- 数组: 存储的时同一种数据类型;
- list:容器, 可以存储任意数据类型;

# 一维数组和数组的计算
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]
add = lambda x: x[0] + x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([add(item) for item in zip(a, b)])

mul = lambda x: x[0] * x[1]
# [(1,2), (2,3), (3,4), (4,5)]
print([mul(item) for item in zip(a, b)])

# 二维数组和数组的计算

c = [[1, 2, 3, 4],
     [1, 2, 3, 4]]
d = [[2, 3, 4, 5],
     [2, 3, 4, 5]]
#
# print(c*d)
print(c+d)
[3, 5, 7, 9]
[2, 6, 12, 20]
[[1, 2, 3, 4], [1, 2, 3, 4], [2, 3, 4, 5], [2, 3, 4, 5]]

3.numpy操作
1)numpy中如何创建数组(矩阵)?

import numpy as np
# 方法1:
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4,5])
c1 = np.array(range(1,6))
print(a+b)
print(c1)

# 方法2:
c2 = np.arange(1,6)
print(c2)

# 数组的类名: numpy.ndarray
print(type(c1))

# 查看数据元素的类型
print(c1.dtype)
[ 2  4  6  8 10]
[1 2 3 4 5]
[1 2 3 4 5]
<class 'numpy.ndarray'>
int64

2)修改数组的数据类型

print(c1.astype('float'))
print(c1.astype('bool'))
print(c1.astype('?'))  # ?是bool类型的代号;
# 创建的时候指定数据类型
print(np.array([1,2,3,4], dtype=np.float))
[1. 2. 3. 4. 5.]
[ True  True  True  True  True]
[ True  True  True  True  True]
[1. 2. 3. 4.]

3)修改浮点数的小数位数

c3 = np.array([1.234556, 3.45464456, 5.645657567])
print(np.round(c3, 2))
.
[1.23 3.45 5.65]

4.numpy读取数据
读取eg6-a-student-data.txt 文件中的性别信息和体重信息
eg6-a-student-data.txt 文件内容:

Subject Sex    DOB      Height  Weight       BP     VO2max
(ID)    M/F  dd/mm/yy     m       kg        mmHg  mL.kg-1.min-1
JW-1     M    19/12/95    1.82     92.4    119/76   39.3
JW-2     M    11/1/96     1.77     80.9    114/73   35.5
JW-3     F    2/10/95     1.68     69.7    124/79   29.1
JW-6     M    6/7/95      1.72     75.5    110/60   45.5
# JW-7    F    28/3/96     1.66     72.4    101/68   -
JW-9     F    11/12/95    1.78     82.1    115/75   32.3
JW-10    F    7/4/96      1.60     -       -/-      30.1
JW-11    M    22/8/95     1.72     77.2    97/63    48.8
JW-12    M    23/5/96     1.83     88.9    105/70   37.7
JW-14    F    12/1/96     1.56     56.3    108/72   26.0
JW-15    F    1/6/96      1.64     65.0    99/67    35.7
JW-16    M    10/9/95     1.63     73.0    131/84   29.9
JW-17    M    17/2/96     1.67     89.8    101/76   40.2
JW-18    M    31/7/96     1.66     75.1    -/-      -
JW-19    F    30/10/95    1.59     67.3    103/69   33.5
JW-22    F    9/3/96      1.70     -       119/80   30.9
JW-23    M    15/5/95     1.97     89.2    124/82   -
JW-24    F    1/12/95     1.66     63.8    100/78   -
JW-25    F    25/10/95    1.63     64.4    -/-      28.0
JW-26    M    17/4/96     1.69     -       121/82   39.
import numpy as np

fname = "doc/eg6-a-student-data.txt"
dtype = np.dtype([('gender', '|S1'), ('height', 'f2')])
# fname: 文件的名称, 可以是文件名, 也可以是ugz或者bz2的压缩文件;
# dtype: 数据类型, 可选, 默认是float;
# delimiter: 分隔符字符串, 默认情况是任何的空格,
# skiprows: 跳过前xx行, 一般情况跳过第一行;
# usecols: 读取指定的列, 可以是元组;
# unpack: 如果为True, 对返回的数组对象转置;
data = np.loadtxt(fname=fname, dtype=dtype, skiprows=9, usecols=(1, 3), unpack=True)
print(data)
[array([b'M', b'M', b'F', b'M', b'F', b'F', b'M', b'M', b'F', b'F', b'M',
       b'M', b'M', b'F', b'F', b'M', b'F', b'F', b'M'], dtype='|S1'), array([1.82, 1.77, 1.68, 1.72, 1.78, 1.6 , 1.72, 1.83, 1.56, 1.64, 1.63,
       1.67, 1.66, 1.59, 1.7 , 1.97, 1.66, 1.63, 1.69], dtype=float16)]

5.numpy数组的转置

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)


# 1).
print(data.transpose())

# 2). 0轴 , 1 轴
print(data.swapaxes(1, 0))

# 3).
print(data.T)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]
[[ 0  4  8]
 [ 1  5  9]
 [ 2  6 10]
 [ 3  7 11]]

6.numpy数组的索引和切片

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)

# 取第一行的数据
print(data[0])

#  取第一列的数据
print(data.T[0])
print(data[:, 1])

# 获取多行
print(data[:2])

# 获取多行列
print(data.T[:2])
print(data[:, :2])


# 获取指定行的前几列;
print(data)
print(data[[0,2], :2])
print(data[:2, [0,2]])
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[0 1 2 3]
[0 4 8]
[1 5 9]
[[0 1 2 3]
 [4 5 6 7]]
[[0 4 8]
 [1 5 9]]
[[0 1]
 [4 5]
 [8 9]]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[0 1]
 [8 9]]
[[0 2]
 [4 6]]

7)numpy中数值的修改

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
print(data)

# # 取第一行的数据
data[0] = 0
print(data)

# # 获取多行列
data.T[:2] = 0
print(data)


# # 布尔索引: 复杂的条件: data中所有大于8的数字都替换为0;
# # 返回一个三行四列的数组, 存储的是Bool值
print(data>8)
data[data>8] = 0
print(data)


# 复杂的条件: data中所有大于8的数字都替换为0, 否则替换为1; a>b?a:b
print(data)
data[data<=8] = 1
data[data>8] = 0
print(data)
print(np.where(data <= 8, 1, 0))

# 裁剪: 如果data<=8, 替换称8, 如果data>=10, 替换为10;
print(data)
print(data.clip(8, 10))
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  0  0  0]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  0  0  0]
 [ 0  0  6  7]
 [ 0  0 10 11]]
[[False False False False]
 [False False False False]
 [False False  True  True]]
[[0 0 0 0]
 [0 0 6 7]
 [0 0 0 0]]
[[0 0 0 0]
 [0 0 6 7]
 [0 0 0 0]]
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
[[8 8 8 8]
 [8 8 8 8]
 [8 8 8 8]]

8.numpy中数组的拼接

import numpy as np
# 数组的拼接
t1 = np.arange(12).reshape(2, 6)
t2 = np.arange(12).reshape(2, 6)
t3 = np.arange(12).reshape(2, 6)

# 竖直拼接(vertically)
print(np.vstack((t1, t2, t3)))
# 水平拼接(horizontally)
print(np.hstack((t1, t2, t3)))

# *************************************************
# 数组的行列交换
t4 = np.arange(12).reshape(2, 6)
# 行交换(第一行和第二行进行交换)
print("原数据:\n", t4)
t4[[0, 1], :] = t4[[1, 0], :]
print("替换后的数据:\n", t4)

# 列交换(第3列和第5列进行交换)
print("原数据:\n", t4)
t4[:, [2, 4]] = t4[:, [4, 2]]
print("替换后的数据:\n", t4)

9.numpy常用的方法

import numpy as np

# 将一维数组转换为3行4列的二维数组
data = np.arange(12).reshape((3, 4))
data[0, 0] = 80
print(data)

# 1. 获取最大值和最小值的位置;
# 获取当前数组里面最大值的索引;
max_item1 = np.argmax(data)
print(max_item1)

# 获取每一列的最大值对应的索引;
print(np.argmax(data, axis=0))
# 获取每一行的最大值对应的索引;
print(np.argmax(data, axis=1))

# 2. 创建一个全为0的数组;
print(np.zeros((3, 3), dtype=np.int))

# 3. 创建一个全为1的数组;
print(np.ones((3, 4)))

# 4. 创建一个对角线全为1的正方形数组(方阵)
print(np.eye(3))
[[80  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
0
[0 2 2 2]
[0 3 3]
[[0 0 0]
 [0 0 0]
 [0 0 0]]
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

10.numpy中的深拷贝和浅拷贝

  • 列表的深拷贝和浅拷贝

    • 浅拷贝: a= b[::] a = copy.copy(b)
    • 深拷贝: a = copy.deepcopy(b)
  • numpy中的拷贝

    • data1 = data: 完全不复制, 两个变量相互影响, 指向同一块内存空间;
    • data2 = data[::], 会创建新的对象data2,但是data的数据完全由data2保管, 两个的数据变化是一致的;
    • data3 = data.copy(), 深拷贝, 两个变量不湖影响;

11.numpy中的nan和inf

nan(not a number):表示不是一个数字,代表的是数据缺失

nan的特殊属性:

  • nan是float类型

  • 两个nan的值是不相等的:

      ```
      >>> import numpy as np
      >>> data = np.arange(12,dtype=np.float).reshape(3,4)
      >>> data[:2,2] = np.nan
      >>> data
      array([[ 0.,  1.,  2.,  3.],
             [ 4.,  5.,  6.,  7.],
             [ 8.,  9., 10., 11.]])
      data[:2, 2] = np.nan
      data
      array([[ 0.,  1., nan,  3.],
          [ 4.,  5., nan,  7.],
          [ 8.,  9., 10., 11.]])
      >>> np.nan == np.nan
      False
      >>> np.nan != np.nan
      True
      ```
    
  • 判断data里面的缺失值

      ```
      >>> data!=data
      array([[False, False,  True, False],
             [False, False,  True, False],
             [False, False, False, False]])
      
      >>> np.isnan(data)
      array([[False, False,  True, False],
             [False, False,  True, False],
             [False, False, False, False]])
      >>> data
      array([[ 0.,  1., nan,  3.],
             [ 4.,  5., nan,  7.],
             [ 8.,  9., 10., 11.]])
      ```
    
  • 判断有多少个缺失值:

      >>> np.count_nonzero(data!=data)
      2       
      >>> np.count_nonzero(np.isnan(data))
      2
    

inf(infinity):inf代表正无穷,-inf代表负无穷

import numpy as np

print(np.nan)
print(np.inf)
print(-np.inf)
nan
inf
-inf

12.numpy常用的统计方法

1)求和

import numpy as np
data = np.arange(12, dtype=np.float).reshape(3, 4)
print(data.sum())
# 每一列数据的和;
print(data.sum(axis=0))
# 每一行数据的和;
print(data.sum(axis=1))

66.0
[12. 15. 18. 21.]
[ 6. 22. 38.]

2)均值

print(data.mean())
print(data.mean(axis=0))
print(data.mean(axis=1))
5.5
[4. 5. 6. 7.]
[1.5 5.5 9.5]

3)中值

print(data)
print(np.median(data))
print(np.median(data, axis=0))
print(np.median(data, axis=1))
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]]
5.5
[4. 5. 6. 7.]
[1.5 5.5 9.5]

4)最大值
5)最小值

print(data.max())
print(data.max(axis=0))
print(data.max(axis=1))
11.0
[ 8.  9. 10. 11.]
[ 3.  7. 11.]

6)极差

print(np.ptp(data))
print(np.ptp(data, axis=0))
print(np.ptp(data, axis=1))
11.0
[8. 8. 8. 8.]
[3. 3. 3.]

7)标准差
代表的是数据的波动稳定情况, 数字越大, 越不稳定;

print(data.std())
print(data.std(axis=0))
print(data.std(axis=1))
3.452052529534663
[3.26598632 3.26598632 3.26598632 3.26598632]
[1.11803399 1.11803399 1.11803399]

13.案例_学生身高体重统计分析

获取eg6-a-student-data.txt 文件中的身高体重信息

Subject Sex    DOB      Height  Weight       BP     VO2max
(ID)    M/F  dd/mm/yy     m       kg        mmHg  mL.kg-1.min-1
JW-1     M    19/12/95    1.82     92.4    119/76   39.3
JW-2     M    11/1/96     1.77     80.9    114/73   35.5
JW-3     F    2/10/95     1.68     69.7    124/79   29.1
JW-6     M    6/7/95      1.72     75.5    110/60   45.5
# JW-7    F    28/3/96     1.66     72.4    101/68   -
JW-9     F    11/12/95    1.78     82.1    115/75   32.3
JW-10    F    7/4/96      1.60     -       -/-      30.1
JW-11    M    22/8/95     1.72     77.2    97/63    48.8
JW-12    M    23/5/96     1.83     88.9    105/70   37.7
JW-14    F    12/1/96     1.56     56.3    108/72   26.0
JW-15    F    1/6/96      1.64     65.0    99/67    35.7
JW-16    M    10/9/95     1.63     73.0    131/84   29.9
JW-17    M    17/2/96     1.67     89.8    101/76   40.2
JW-18    M    31/7/96     1.66     75.1    -/-      -
JW-19    F    30/10/95    1.59     67.3    103/69   33.5
JW-22    F    9/3/96      1.70     -       119/80   30.9
JW-23    M    15/5/95     1.97     89.2    124/82   -
JW-24    F    1/12/95     1.66     63.8    100/78   -
JW-25    F    25/10/95    1.63     64.4    -/-      28.0
JW-26    M    17/4/96     1.69     -       121/82   39.

需求1:
获取所有男生的身高,求平均值;
获取所有女生的身高,求平均值;
并绘制柱状图显示。

import numpy as np
from pyecharts import Bar

filename = 'doc/eg6-a-student-data.txt'
datatype = np.dtype([('gender', '|S1'), ('height', 'f4')])
data = np.loadtxt(fname=filename, dtype=datatype, skiprows=9, usecols=(1, 3))

# 判断性别是否为男性
isMale = data['gender'] == b'M'
male_avg_height = data['height
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值