此学习笔记参考与"莫烦Python”
先来看一个简单的实例:
import numpy as np
# 矩阵转为numpy
array =np.array([[1,2,3],
[4,5,6]])
print(array)
print("*******************************************************")
print("dimension:", array.ndim)
print("*******************************************************")
print("shape:", array.shape)
print("*******************************************************")
print("size:", array.size)
输出:
[[1 2 3]
[4 5 6]]
*******************************************************
dimension: 2
*******************************************************
shape: (2, 3)
*******************************************************
size: 6
下面我们看下如何通过numpy创建各种各样的矩阵何数组:
import numpy as np
# 矩阵转为numpy,可以指定数据类型,默认都是64位
array1 =np.array([[1,2,3],
[4,5,6]], dtype=float)
array2 =np.array([[1,2,3],
[4,5,6]], dtype=int)
print(array1.dtype)
print("*******************************************************")
print(array2.dtype)
注意:上面我们创建numpy都是直接通过矩阵直接转为numpy,矩阵是几维的,最外层就要有几个中括号。
输出:
float64
*******************************************************
int32
import numpy as np
# 直接创建一些特殊的矩阵
a = np.zeros((3, 4))
b = np.ones((4, 5))
print(a)
print("*******************************************************")
print(b)
输出:
看下面的输出,默认为浮点数
[[0. 0. 0. 0.]
[0. 0. 0. 0.]
[0. 0. 0. 0.]]
*******************************************************
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
import numpy as np
# 生成一个数列,步进为2
a = np.arange(10, 20, 2)
# 生成从0-11的有序数
b = np.arange(12)
# 生成从0-11的有序数,并排成三行四列
c = np.arange(12).reshape((3,4))
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
print(c)
输出:
[10 12 14 16 18]
*******************************************************
[ 0 1 2 3 4 5 6 7 8 9 10 11]
*******************************************************
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
numpy的基本定义了解了,我们再来看下numpy的计算方式:
import numpy as np
a = np.array([10, 20, 30, 40])
b = np.arange(4)
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
print(a-b)
print("*******************************************************")
print(a*b)
print("*******************************************************")
# 对b求平方
print(b ** 2)
print("*******************************************************")
print(a ** b)
print("*******************************************************")
# 求a的正弦
print(np.sin(a))
print("*******************************************************")
print(np.cos(b))
输出:
[10 20 30 40]
*******************************************************
[0 1 2 3]
*******************************************************
[10 19 28 37]
*******************************************************
[ 0 20 60 120]
*******************************************************
[0 1 4 9]
*******************************************************
[ 1 20 900 64000]
*******************************************************
[-0.54402111 0.91294525 -0.98803162 0.74511316]
*******************************************************
[ 1. 0.54030231 -0.41614684 -0.9899925 ]
import numpy as np
a = np.array([10, 20, 30, 40])
b = np.arange(4)
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
# 判断元素的是否大于某个数
print(b<3)
print("*******************************************************")
print(a>10)
[10 20 30 40]
*******************************************************
[0 1 2 3]
*******************************************************
[ True True True False]
*******************************************************
[False True True True]
上面的运算是针对列表的,如果是矩阵呢?
import numpy as np
a = np.array([10, 20, 30, 40]).reshape((2, 2))
b = np.arange(4).reshape((2, 2))
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
# 点乘
print(a*b)
print("*******************************************************")
# 矩阵乘法
print(np.dot(a, b))
print("*******************************************************")
# 矩阵乘法,跟上面等价
print(a.dot(b))
输出:
[[10 20]
[30 40]]
*******************************************************
[[0 1]
[2 3]]
*******************************************************
[[ 0 20]
[ 60 120]]
*******************************************************
[[ 40 70]
[ 80 150]]
*******************************************************
[[ 40 70]
[ 80 150]]
import numpy as np
# 创建随机矩阵,范围0-1,大小2行4列
a = np.random.random((2,4))
print(a)
print("*******************************************************")
# 求和,全部数值相加
print(np.sum(a))
print("*******************************************************")
# 最小值
print(np.min(a))
print("*******************************************************")
# 最大值
print(np.max(a))
print("*******************************************************")
# 列数求和
print(np.sum(a, axis=1))
print("*******************************************************")
# 行数求和
print(np.sum(a, axis=0))
print("*******************************************************")
# 列数找最大
print(np.max(a, axis=1))
输出:
[[0.29982972 0.13905535 0.87958354 0.70557501]
[0.42347836 0.4688335 0.55487963 0.93001836]]
*******************************************************
4.4012534656078515
*******************************************************
0.13905534543526998
*******************************************************
0.9300183580214993
*******************************************************
[2.02404362 2.37720985]
*******************************************************
[0.72330809 0.60788884 1.43446316 1.63559337]
*******************************************************
[0.87958354 0.93001836]
import numpy as np
# 创建numpy矩阵
a = np.arange(2,14).reshape(3, 4)
print(a)
print("*******************************************************")
# 寻找最小值的索引
print(np.argmin(a))
print("*******************************************************")
# 寻找最大值的索引
print(np.argmax(a))
print("*******************************************************")
# 求平均值
print(np.mean(a))
print("*******************************************************")
print(np.average(a))
print("*******************************************************")
# 中位数
print(np.median(a))
print("*******************************************************")
# 逐步累加
print(np.cumsum(a))
print("*******************************************************")
# 每两个数之间的差
print(np.diff(a))
print("*******************************************************")
# 找出非0数,输出结果有两个数组,第一个表示行,第二个表示列
print(np.nonzero(a))
print("*******************************************************")
# 排序
print(np.sort(a))
print("*******************************************************")
# 转置
print(np.transpose(a))
print("*******************************************************")
print(a.T)
输出:
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
*******************************************************
0
*******************************************************
11
*******************************************************
7.5
*******************************************************
7.5
*******************************************************
7.5
*******************************************************
[ 2 5 9 14 20 27 35 44 54 65 77 90]
*******************************************************
[[1 1 1]
[1 1 1]
[1 1 1]]
*******************************************************
(array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64))
*******************************************************
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
*******************************************************
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
*******************************************************
[[ 2 6 10]
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]]
import numpy as np
# 创建numpy矩阵
a = np.arange(2,14).reshape(3, 4)
print(a)
print("*******************************************************")
# 小于5的数等于5,大于9的数等于9,中间数值不变
print(np.clip(a, 5, 9))
print("*******************************************************")
# 计算行或者列的平均值
print(np.mean(a, axis=1))
[[ 2 3 4 5]
[ 6 7 8 9]
[10 11 12 13]]
*******************************************************
[[5 5 5 5]
[6 7 8 9]
[9 9 9 9]]
*******************************************************
[ 3.5 7.5 11.5]
numy的基本运算讲过了,我们接下来看下numpy的索引
import numpy as np
# 创建numpy矩阵
a = np.arange(3,15)
print(a)
print("*******************************************************")
print(a[3])
print("*******************************************************")
b = np.arange(3,15).reshape((3,4))
print(b)
print("*******************************************************")
# 输出一行的值
print(b[2])
print("*******************************************************")
# 具体到某一行某一列
print(b[2][2])
print("*******************************************************")
# 上面的输出也可以用下面的方法
print(b[2, 2])
print("*******************************************************")
# 输出第二行的所有数
print(b[1,:])
print("*******************************************************")
# 输出第二列的所有数
print(b[:,1])
print("*******************************************************")
# 输出第二行的第二到第三个值,左闭右开
print(b[1,1:2])
print("*******************************************************")
# 迭代每一行
for row in b:
print(row)
print("*******************************************************")
# 转置之迭代列:
for column in b.T:
print(column)
print("*******************************************************")
# 迭代每一个元素:
for item in b.flatten():
print(item)
[ 3 4 5 6 7 8 9 10 11 12 13 14]
*******************************************************
6
*******************************************************
[[ 3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]]
*******************************************************
[11 12 13 14]
*******************************************************
13
*******************************************************
13
*******************************************************
[ 7 8 9 10]
*******************************************************
[ 4 8 12]
*******************************************************
[8]
*******************************************************
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]
*******************************************************
[ 3 7 11]
[ 4 8 12]
[ 5 9 13]
[ 6 10 14]
*******************************************************
3
4
5
6
7
8
9
10
11
12
13
14
下面我们再来讲下numpy的合并
import numpy as np
# 创建numpy矩阵
a = np.array([1, 1, 1])
b = np.array([2, 2, 2])
print(a.shape)
print("*******************************************************")
print(b.shape)
print("*******************************************************")
# 上下合并
c = np.vstack((a, b))
print(c.shape)
print("*******************************************************")
# 左右合并
d = np.hstack((a, b))
print(d)
print("*******************************************************")
print(d.shape)
print("*******************************************************")
# 把a从一行变成一列(直接转置无法实现)
# 在行方向加一个维度
print(a[np.newaxis, :])
print("*******************************************************")
# 在列方向加一个维度
print(a[:, np.newaxis])
print("*******************************************************")
# 多个numpy的合并
f = np.concatenate((a, b, b, a))
# 多个numpy的合并,也可以指定维度
g = np.concatenate((a, b, b, a), axis=0)
print(f)
print("*******************************************************")
print(g)
输出:
(3,)
*******************************************************
(3,)
*******************************************************
(2, 3)
*******************************************************
[1 1 1 2 2 2]
*******************************************************
(6,)
*******************************************************
[[1 1 1]]
*******************************************************
[[1]
[1]
[1]]
*******************************************************
[1 1 1 2 2 2 2 2 2 1 1 1]
*******************************************************
[1 1 1 2 2 2 2 2 2 1 1 1]
下面我们再来讲下numpy的分割, 这个地方用的应该是最多的
import numpy as np
# 创建numpy矩阵
a = np.arange(12).reshape((3, 4))
print(a)
print("*******************************************************")
# 按列进行分割,输出两个array
print(np.split(a, 2, axis=1))
print("*******************************************************")
# 按行进行分割,输出3个array
print(np.split(a, 3, axis=0))
print("*******************************************************")
# 上面的函数只能实现均匀分割,那么怎么实现不等分割呢?
print(np.array_split(a, 3, axis=1))
print("*******************************************************")
# 纵向分割
print(np.vsplit(a, 3))
print("*******************************************************")
# 横向分割
print(np.hsplit(a, 2))
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
*******************************************************
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
*******************************************************
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
*******************************************************
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2],
[ 6],
[10]]), array([[ 3],
[ 7],
[11]])]
*******************************************************
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]
*******************************************************
[array([[0, 1],
[4, 5],
[8, 9]]), array([[ 2, 3],
[ 6, 7],
[10, 11]])]
上面介绍了分割,下面我们再来介绍下numpy的赋值操作
import numpy as np
# 创建numpy矩阵
a = np.arange(4)
b = a
c = a
print(b is a)
print("*******************************************************")
print(c is a)
print("*******************************************************")
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
print(c)
# b,c就是a,改变a就等于改变了b,c
a[1] = 2
print(a)
print("*******************************************************")
print(b)
print("*******************************************************")
print(c)
# 如果只想改变a,但是不想改变b,c怎么办呢?用.copy()
b = a.copy()
c = a.copy()
a[2] =1
print(a)
print("*******************************************************")
print(b)
True
*******************************************************
True
*******************************************************
[0 1 2 3]
*******************************************************
[0 1 2 3]
*******************************************************
[0 1 2 3]
[0 2 2 3]
*******************************************************
[0 2 2 3]
*******************************************************
[0 2 2 3]
[0 2 1 3]
*******************************************************
[0 2 2 3]
至此,numpy的基本用法已经讲完了,接着我们来讲下pandas
pandas
numpy更像列表,矩阵,而pandas更像是一个字典 ,可以给不同行列重新命名。
import pandas as pd
import numpy as np
s = pd.Series([1, 3, 6, np.nan, 44, 1])
print(s)
输出:自动加上了序号,并给出了dtype
0 1.0
1 3.0
2 6.0
3 NaN
4 44.0
5 1.0
dtype: float64
import pandas as pd
import numpy as np
# 创建dataframe
dates = pd.date_range('20220824', periods=6)
print(dates)
print("*******************************************************")
# index也可以不给,不给就按照默认的排序
df = pd.DataFrame(np.random.rand(6,4), columns=['a','b','c','d'])
print(df)
print("*******************************************************")
# index表示行索引,columns表示列索引。
df = pd.DataFrame(np.random.rand(6,4), index=dates, columns=['a','b','c','d'])
print(df)
print("*******************************************************")
# 行和列都不给
df = pd.DataFrame(np.random.rand(6,4))
print(df)
print("*******************************************************")
# 每个键值对表示一列
df = pd.DataFrame({'A':1,
'B':pd.Timedelta('20220824'),
'C':pd.Series(1, index=list(range(4)),dtype="float32"),
'D':np.array([3]*4, dtype='int32'),
'E':pd.Categorical(['test', 'train', 'test', 'test']),
'F': "foo"})
print(df)
print("*******************************************************")
print(df.dtypes)
print("*******************************************************")
# 输出所有行的名字
print(df.index)
print("*******************************************************")
# 输出所有列的名字
print(df.columns)
print("*******************************************************")
# 输出所有值
print(df.values)
print("*******************************************************")
# 描述pd的内容,只能描述数字
print(df.describe())
print("*******************************************************")
# 转置
print(df.T)
print("*******************************************************")
# 按照列index倒序排序
print(df.sort_index(axis=1, ascending=False))
print("*******************************************************")
# 按照行index正序排序
print(df.sort_index(axis=0, ascending=True))
print("*******************************************************")
# 按照value对E列进行排序
print(df.sort_values(by='E'))
输出:
DatetimeIndex(['2022-08-24', '2022-08-25', '2022-08-26', '2022-08-27',
'2022-08-28', '2022-08-29'],
dtype='datetime64[ns]', freq='D')
*******************************************************
a b c d
0 0.322141 0.804775 0.820302 0.835406
1 0.478716 0.763077 0.131844 0.760056
2 0.127714 0.605189 0.052983 0.751993
3 0.701789 0.546006 0.988187 0.229277
4 0.738972 0.896696 0.040440 0.215498
5 0.575188 0.309865 0.222944 0.593111
*******************************************************
a b c d
2022-08-24 0.101176 0.453897 0.568296 0.519793
2022-08-25 0.515109 0.772379 0.026976 0.560379
2022-08-26 0.285702 0.345849 0.681108 0.456773
2022-08-27 0.686737 0.493789 0.940539 0.421047
2022-08-28 0.674883 0.128136 0.465080 0.099789
2022-08-29 0.204265 0.312515 0.398608 0.472152
*******************************************************
0 1 2 3
0 0.084622 0.742653 0.171342 0.851245
1 0.864073 0.133525 0.803310 0.202044
2 0.153710 0.847466 0.276450 0.691162
3 0.252941 0.358187 0.298337 0.639640
4 0.186868 0.060602 0.233869 0.165598
5 0.703033 0.458428 0.615301 0.211415
*******************************************************
A B C D E F
0 1 0 days 00:00:00.020220824 1.0 3 test foo
1 1 0 days 00:00:00.020220824 1.0 3 train foo
2 1 0 days 00:00:00.020220824 1.0 3 test foo
3 1 0 days 00:00:00.020220824 1.0 3 test foo
*******************************************************
A int64
B timedelta64[ns]
C float32
D int32
E category
F object
dtype: object
*******************************************************
Int64Index([0, 1, 2, 3], dtype='int64')
*******************************************************
Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
*******************************************************
[[1 Timedelta('0 days 00:00:00.020220824') 1.0 3 'test' 'foo']
[1 Timedelta('0 days 00:00:00.020220824') 1.0 3 'train' 'foo']
[1 Timedelta('0 days 00:00:00.020220824') 1.0 3 'test' 'foo']
[1 Timedelta('0 days 00:00:00.020220824') 1.0 3 'test' 'foo']]
*******************************************************
A B C D
count 4.0 4 4.0 4.0
mean 1.0 0 days 00:00:00.020220824 1.0 3.0
std 0.0 0 days 00:00:00 0.0 0.0
min 1.0 0 days 00:00:00.020220824 1.0 3.0
25% 1.0 0 days 00:00:00.020220824 1.0 3.0
50% 1.0 0 days 00:00:00.020220824 1.0 3.0
75% 1.0 0 days 00:00:00.020220824 1.0 3.0
max 1.0 0 days 00:00:00.020220824 1.0 3.0
*******************************************************
0 ... 3
A 1 ... 1
B 0 days 00:00:00.020220824 ... 0 days 00:00:00.020220824
C 1.0 ... 1.0
D 3 ... 3
E test ... test
F foo ... foo
[6 rows x 4 columns]
*******************************************************
F E D C B A
0 foo test 3 1.0 0 days 00:00:00.020220824 1
1 foo train 3 1.0 0 days 00:00:00.020220824 1
2 foo test 3 1.0 0 days 00:00:00.020220824 1
3 foo test 3 1.0 0 days 00:00:00.020220824 1
*******************************************************
A B C D E F
0 1 0 days 00:00:00.020220824 1.0 3 test foo
1 1 0 days 00:00:00.020220824 1.0 3 train foo
2 1 0 days 00:00:00.020220824 1.0 3 test foo
3 1 0 days 00:00:00.020220824 1.0 3 test foo
*******************************************************
A B C D E F
0 1 0 days 00:00:00.020220824 1.0 3 test foo
2 1 0 days 00:00:00.020220824 1.0 3 test foo
3 1 0 days 00:00:00.020220824 1.0 3 test foo
1 1 0 days 00:00:00.020220824 1.0 3 train foo
了解完pandas的基本用法之后,下面我们讲下pandas的数据选择。
import pandas as pd
import numpy as np
# 创建dataframe
dates = pd.date_range('20220824', periods=6)
print(dates)
print("*******************************************************")
# index表示行索引,columns表示列索引。
df = pd.DataFrame(np.random.rand(6,4), index=dates, columns=['a','b','c','d'])
print(df)
print("*******************************************************")
# 输出dataframe的某一列
print(df['a'])
print("*******************************************************")
# 输出dataframe的某一列
print(df.a)
print("*******************************************************")
# 按照切片输出0-3行,左闭右开
print(df[0:3])
print("*******************************************************")
# 或者
print(df['20220824':'20220825'])
输出:
DatetimeIndex(['2022-08-24', '2022-08-25', '2022-08-26', '2022-08-27',
'2022-08-28', '2022-08-29'],
dtype='datetime64[ns]', freq='D')
*******************************************************
a b c d
2022-08-24 0.646988 0.799752 0.345846 0.554346
2022-08-25 0.865591 0.885551 0.904043 0.211425
2022-08-26 0.343881 0.144555 0.582355 0.000438
2022-08-27 0.085118 0.689027 0.804335 0.019550
2022-08-28 0.924346 0.909819 0.028469 0.137617
2022-08-29 0.706471 0.526320 0.046814 0.199300
*******************************************************
2022-08-24 0.646988
2022-08-25 0.865591
2022-08-26 0.343881
2022-08-27 0.085118
2022-08-28 0.924346
2022-08-29 0.706471
Freq: D, Name: a, dtype: float64
*******************************************************
2022-08-24 0.646988
2022-08-25 0.865591
2022-08-26 0.343881
2022-08-27 0.085118
2022-08-28 0.924346
2022-08-29 0.706471
Freq: D, Name: a, dtype: float64
*******************************************************
a b c d
2022-08-24 0.646988 0.799752 0.345846 0.554346
2022-08-25 0.865591 0.885551 0.904043 0.211425
2022-08-26 0.343881 0.144555 0.582355 0.000438
*******************************************************
a b c d
2022-08-24 0.646988 0.799752 0.345846 0.554346
2022-08-25 0.865591 0.885551 0.904043 0.211425
import pandas as pd
import numpy as np
# 创建dataframe
dates = pd.date_range('20220824', periods=6)
print(dates)
print("*******************************************************")
# index表示行索引,columns表示列索引。
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print(df)
print("*******************************************************")
# 按照标签选择输出,输出20220824这一行
print(df.loc["20220824"])
print("*******************************************************")
# 按照标签选择输出,输出所有行,对列进行筛选,输出a,b列
print(df.loc[:, ['a', 'b']])
print("*******************************************************")
# 按照标签选择输出,输出所某一行,输出a,b列
print(df.loc['20220824', ['a', 'b']])
print("*******************************************************")
# 根据位置进行选择输出,输出第三行的内容
print(df.iloc[3])
print("*******************************************************")
# 根据位置进行选择输出,输出第三行第一位的内容
print(df.iloc[3, 1])
print("*******************************************************")
# 根据位置进行选择输出,输出第三行到第五行,第一位到第三位的内容
print(df.iloc[3:5, 1:3])
print("*******************************************************")
# 根据位置进行选择输出,输出第三行,第三行,第五行,第一位到第三位的内容
print(df.iloc[[1, 3, 5], 1:3])
print("*******************************************************")
# 根据标签和位置一块筛选
print(df.iloc[:3, [0, 2]])
print("*******************************************************")
# 根据是否筛选,筛选a对应的列大于0.5的数,其他的列也会显示
print(df[df.a>0.5])
print("*******************************************************")
DatetimeIndex(['2022-08-24', '2022-08-25', '2022-08-26', '2022-08-27',
'2022-08-28', '2022-08-29'],
dtype='datetime64[ns]', freq='D')
*******************************************************
a b c d
2022-08-24 0.360561 0.951445 0.368842 0.423700
2022-08-25 0.745406 0.487755 0.082541 0.923315
2022-08-26 0.845194 0.862823 0.102322 0.533116
2022-08-27 0.314568 0.260943 0.317622 0.422537
2022-08-28 0.645892 0.811711 0.868300 0.551252
2022-08-29 0.263214 0.629542 0.901477 0.622732
*******************************************************
a 0.360561
b 0.951445
c 0.368842
d 0.423700
Name: 2022-08-24 00:00:00, dtype: float64
*******************************************************
a b
2022-08-24 0.360561 0.951445
2022-08-25 0.745406 0.487755
2022-08-26 0.845194 0.862823
2022-08-27 0.314568 0.260943
2022-08-28 0.645892 0.811711
2022-08-29 0.263214 0.629542
*******************************************************
a 0.360561
b 0.951445
Name: 2022-08-24 00:00:00, dtype: float64
*******************************************************
a 0.314568
b 0.260943
c 0.317622
d 0.422537
Name: 2022-08-27 00:00:00, dtype: float64
*******************************************************
0.2609427910112532
*******************************************************
b c
2022-08-27 0.260943 0.317622
2022-08-28 0.811711 0.868300
*******************************************************
b c
2022-08-25 0.487755 0.082541
2022-08-27 0.260943 0.317622
2022-08-29 0.629542 0.901477
*******************************************************
a c
2022-08-24 0.360561 0.368842
2022-08-25 0.745406 0.082541
2022-08-26 0.845194 0.102322
*******************************************************
a b c d
2022-08-25 0.745406 0.487755 0.082541 0.923315
2022-08-26 0.845194 0.862823 0.102322 0.533116
2022-08-28 0.645892 0.811711 0.868300 0.551252
*******************************************************
接下来我们讲下pandas的设置,给pandas选定的范围赋其他的值
import pandas as pd
import numpy as np
dates = pd.date_range("20220824", periods=6)
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print(df)
print("*******************************************************")
# 修改第二列第二行
df.iloc[2, 2] = 111
print(df)
print("*******************************************************")
# 以标签的形式来改
df.loc['20220825', 'b'] = 222
print(df)
print("*******************************************************")
# b列大于0.4的赋值为0,不扩展到整个df上
df.a[df.b > 0.5] = 0
print(df)
print("*******************************************************")
# a列大于0.4的赋值为0,扩展到整个df上全部赋值为0
df[df.a > 0.5] = 0
print(df)
print("*******************************************************")
# 在df上新增一列,index=dates要跟原来的一样
df['e'] = pd.Series([1, 2, 3, 4, 5, 6], index=dates)
print(df)
2022-08-24 0.454015 0.745689 0.486978 0.002213
2022-08-25 0.092632 0.849953 0.246611 0.911748
2022-08-26 0.230064 0.066853 0.718545 0.105528
2022-08-27 0.906299 0.116962 0.244463 0.938455
2022-08-28 0.829681 0.656743 0.379104 0.883769
2022-08-29 0.301219 0.783921 0.842942 0.899679
*******************************************************
a b c d
2022-08-24 0.454015 0.745689 0.486978 0.002213
2022-08-25 0.092632 0.849953 0.246611 0.911748
2022-08-26 0.230064 0.066853 111.000000 0.105528
2022-08-27 0.906299 0.116962 0.244463 0.938455
2022-08-28 0.829681 0.656743 0.379104 0.883769
2022-08-29 0.301219 0.783921 0.842942 0.899679
*******************************************************
a b c d
2022-08-24 0.454015 0.745689 0.486978 0.002213
2022-08-25 0.092632 222.000000 0.246611 0.911748
2022-08-26 0.230064 0.066853 111.000000 0.105528
2022-08-27 0.906299 0.116962 0.244463 0.938455
2022-08-28 0.829681 0.656743 0.379104 0.883769
2022-08-29 0.301219 0.783921 0.842942 0.899679
*******************************************************
a b c d
2022-08-24 0.000000 0.745689 0.486978 0.002213
2022-08-25 0.000000 222.000000 0.246611 0.911748
2022-08-26 0.230064 0.066853 111.000000 0.105528
2022-08-27 0.906299 0.116962 0.244463 0.938455
2022-08-28 0.000000 0.656743 0.379104 0.883769
2022-08-29 0.000000 0.783921 0.842942 0.899679
*******************************************************
a b c d
2022-08-24 0.000000 0.745689 0.486978 0.002213
2022-08-25 0.000000 222.000000 0.246611 0.911748
2022-08-26 0.230064 0.066853 111.000000 0.105528
2022-08-27 0.000000 0.000000 0.000000 0.000000
2022-08-28 0.000000 0.656743 0.379104 0.883769
2022-08-29 0.000000 0.783921 0.842942 0.899679
*******************************************************
a b c d e
2022-08-24 0.000000 0.745689 0.486978 0.002213 1
2022-08-25 0.000000 222.000000 0.246611 0.911748 2
2022-08-26 0.230064 0.066853 111.000000 0.105528 3
2022-08-27 0.000000 0.000000 0.000000 0.000000 4
2022-08-28 0.000000 0.656743 0.379104 0.883769 5
2022-08-29 0.000000 0.783921 0.842942 0.899679 6
上面讲了怎么对pandas的修改,赋值,下面我们讲下怎么处理数据丢失的问题,如出现的NaN
import pandas as pd
import numpy as np
dates = pd.date_range("20220824", periods=6)
df = pd.DataFrame(np.random.rand(6, 4), index=dates, columns=['a', 'b', 'c', 'd'])
print(df)
print("*******************************************************")
# 先赋值几个NaN假设数据丢失
df.iloc[0,1] = np.nan
df.iloc[1,2] = np.nan
print(df)
print("*******************************************************")
# 按行/列丢掉nan,把整行丢掉.any表示有一个nan就丢掉整行/列,all的话表示只有全部是nan才丢掉这一行/列,axis=0按行,=1按列
print(df.dropna(axis=0, how="any")) #how={"any","all" }
print("*******************************************************")
print(df.dropna(axis=1, how="any")) #how={"any","all" }
print("*******************************************************")
# 对缺失的数据处理为默认值
print(df.fillna(value=0))
print("*******************************************************")
# 判断是否有缺失数据,any表示至少丢失一个
print(np.any(df.isnull())==True)
print("*******************************************************")
输出:
a b c d
2022-08-24 0.314775 0.768203 0.239170 0.144463
2022-08-25 0.360352 0.328783 0.558275 0.658506
2022-08-26 0.174112 0.484550 0.735012 0.683943
2022-08-27 0.304718 0.347889 0.062371 0.349119
2022-08-28 0.836975 0.266244 0.750247 0.723921
2022-08-29 0.777215 0.006923 0.597123 0.616330
*******************************************************
a b c d
2022-08-24 0.314775 NaN 0.239170 0.144463
2022-08-25 0.360352 0.328783 NaN 0.658506
2022-08-26 0.174112 0.484550 0.735012 0.683943
2022-08-27 0.304718 0.347889 0.062371 0.349119
2022-08-28 0.836975 0.266244 0.750247 0.723921
2022-08-29 0.777215 0.006923 0.597123 0.616330
*******************************************************
a b c d
2022-08-26 0.174112 0.484550 0.735012 0.683943
2022-08-27 0.304718 0.347889 0.062371 0.349119
2022-08-28 0.836975 0.266244 0.750247 0.723921
2022-08-29 0.777215 0.006923 0.597123 0.616330
*******************************************************
a d
2022-08-24 0.314775 0.144463
2022-08-25 0.360352 0.658506
2022-08-26 0.174112 0.683943
2022-08-27 0.304718 0.349119
2022-08-28 0.836975 0.723921
2022-08-29 0.777215 0.616330
*******************************************************
a b c d
2022-08-24 0.314775 0.000000 0.239170 0.144463
2022-08-25 0.360352 0.328783 0.000000 0.658506
2022-08-26 0.174112 0.484550 0.735012 0.683943
2022-08-27 0.304718 0.347889 0.062371 0.349119
2022-08-28 0.836975 0.266244 0.750247 0.723921
2022-08-29 0.777215 0.006923 0.597123 0.616330
*******************************************************
True
*******************************************************
上面讲了怎么对丢失的数据处理,下面讲一个非常有用的知识点,pandas怎么实现导入导出,怎么处理已经存储好的表格。可以处理csv,excel,hdf,aql,json,pickle,html等格式
我们要读取的文件如下:
import pandas as pd
import numpy as np
# 读取,默认加了索引
data = pd.read_csv("D:\\program\\Test\\numpy\\Student data.csv")
print(data)
# 存储
data.to_pickle("student data.pickle")
输出:
Student ID name age gender
0 1000 Tom 10 M
1 1001 Jerry 11 W
2 1002 Chase 12 M
3 1003 Grant 13 M
4 1004 Jack 14 M
5 1005 Pony 15 W
6 1006 Rose 16 W
7 1007 Charse 17 M
8 1008 Victor 18 W
9 1009 Jim 19 W
10 1010 Tim 20 M
上面我们讲了apndas的文件操作,下面我们再来讲下pandas的合并:
import pandas as pd
import numpy as np
# concat
# 创建三个dataframe
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['a', 'b', 'c', 'd'])
df3 = pd.DataFrame(np.ones((3, 4)) * 2, columns=['a', 'b', 'c', 'd'])
# 数据合并,axis笔试合并方向,按行还是按列。合并之后行列的符号人保留原来的
res = pd.concat([df1, df2, df3], axis=0)
print(res)
print("*******************************************************")
res = pd.concat([df1, df2, df3], axis=1)
print(res)
print("*******************************************************")
# 忽略索引号
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
print(res)
print("*******************************************************")
res = pd.concat([df1, df2, df3], axis=1, ignore_index=True)
print(res)
print("*******************************************************")
输出:
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0
*******************************************************
a b c d a b c d a b c d
0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
1 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
*******************************************************
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 2.0 2.0 2.0 2.0
7 2.0 2.0 2.0 2.0
8 2.0 2.0 2.0 2.0
*******************************************************
0 1 2 3 4 5 6 7 8 9 10 11
0 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
1 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
*******************************************************
import pandas as pd
import numpy as np
# join
# 创建三个dataframe
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
print(df1)
print("*******************************************************")
print(df2)
print("*******************************************************")
# 直接合并,一方没有的填充nan, join默认为"outer", axis默认为0
res = pd.concat([df1, df2])
print(res)
print("*******************************************************")
# 只合并相同的地方
res = pd.concat([df1, df2],join="inner",ignore_index=True)
print(res)
print("*******************************************************")
a b c d
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
*******************************************************
b c d e
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
*******************************************************
a b c d e
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 0.0 0.0 0.0 0.0 NaN
2 NaN 1.0 1.0 1.0 1.0
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
*******************************************************
b c d
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 1.0 1.0 1.0
4 1.0 1.0 1.0
5 1.0 1.0 1.0
*******************************************************
import pandas as pd
import numpy as np
# join
# 创建三个dataframe
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
print(df1)
print("*******************************************************")
print(df2)
print("*******************************************************")
res = pd.concat([df1, df2], axis=1)
print(res)
print("*******************************************************")
# 左右合并,行号不一样有冲突,一方没有的填充nan。加一个reindex(df1.index)表示按照df1的行号排序
res = pd.concat([df1, df2], axis=1).reindex(df1.index)
print(res)
print("*******************************************************")
a b c d
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
*******************************************************
b c d e
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
*******************************************************
a b c d b c d e
1 0.0 0.0 0.0 0.0 NaN NaN NaN NaN
2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
3 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
4 NaN NaN NaN NaN 1.0 1.0 1.0 1.0
*******************************************************
a b c d b c d e
1 0.0 0.0 0.0 0.0 NaN NaN NaN NaN
2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
3 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0
*******************************************************
import pandas as pd
import numpy as np
# join
# 创建三个dataframe
df1 = pd.DataFrame(np.ones((3, 4)) * 0, columns=['a', 'b', 'c', 'd'], index=[1, 2, 3])
df2 = pd.DataFrame(np.ones((3, 4)) * 1, columns=['b', 'c', 'd', 'e'], index=[2, 3, 4])
print(df1)
print("*******************************************************")
print(df2)
print("*******************************************************")
# 默认axis=0
res = df1.append(df2, ignore_index=True)
print(res)
print("*******************************************************")
# 也可以添加列表
res = df1.append([df2, df1], ignore_index=True)
print(res)
print("*******************************************************")
# 一项一项的添加
s1 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
res = df1.append(s1, ignore_index=True)
print(res)
a b c d
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 0.0 0.0 0.0 0.0
*******************************************************
b c d e
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
*******************************************************
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0
*******************************************************
a b c d e
0 0.0 0.0 0.0 0.0 NaN
1 0.0 0.0 0.0 0.0 NaN
2 0.0 0.0 0.0 0.0 NaN
3 NaN 1.0 1.0 1.0 1.0
4 NaN 1.0 1.0 1.0 1.0
5 NaN 1.0 1.0 1.0 1.0
6 0.0 0.0 0.0 0.0 NaN
7 0.0 0.0 0.0 0.0 NaN
8 0.0 0.0 0.0 0.0 NaN
*******************************************************
a b c d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 2.0 3.0 4.0
上面我们讲了关于concat的用法,下面我们再来讲下关于merge的使用教程
import pandas as pd
import numpy as np
# merge:对两组的dataframe的key或者index进行合并。
# 创建两个dataframe
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print("*******************************************************")
print(right)
print("*******************************************************")
# 按照key进行合并
res = pd.merge(left, right, on="key")
print(res)
print("*******************************************************")
输出:
key A B
0 K0 A0 B0
1 K1 A1 B1
2 K2 A2 B2
3 K3 A3 B3
*******************************************************
key C D
0 K0 C0 D0
1 K1 C1 D1
2 K2 C2 D2
3 K3 C3 D3
*******************************************************
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 C2 D2
3 K3 A3 B3 C3 D3
*******************************************************
import pandas as pd
import numpy as np
# merge:对两组的dataframe的key或者index进行合并。
# 创建两个dataframe,如果有两个key呢?
left = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K1', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'],
'key2': ['K0', 'K0', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print("*******************************************************")
print(right)
print("*******************************************************")
# 按照key1,key2进行合并,默认how='inner' ,只考虑相同的部分,how有四种取值["left", 'right', 'outer', 'inner']
res = pd.merge(left, right, on=["key1", "key2"])
print(res)
print("*******************************************************")
res = pd.merge(left, right, on=["key1", "key2"], how="right")
print(res)
print("*******************************************************")
res = pd.merge(left, right, on=["key1", "key2"], how="left")
print(res)
print("*******************************************************")
key1 key2 A B
0 K0 K0 A0 B0
1 K1 K1 A1 B1
2 K2 K0 A2 B2
3 K3 K1 A3 B3
*******************************************************
key1 key2 C D
0 K0 K0 C0 D0
1 K1 K0 C1 D1
2 K2 K0 C2 D2
3 K3 K0 C3 D3
*******************************************************
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K2 K0 A2 B2 C2 D2
*******************************************************
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K0 NaN NaN C1 D1
2 K2 K0 A2 B2 C2 D2
3 K3 K0 NaN NaN C3 D3
*******************************************************
key1 key2 A B C D
0 K0 K0 A0 B0 C0 D0
1 K1 K1 A1 B1 NaN NaN
2 K2 K0 A2 B2 C2 D2
3 K3 K1 A3 B3 NaN NaN
*******************************************************
import pandas as pd
import numpy as np
# indicator参数
df1 = pd.DataFrame({'col1': [0, 1], "col_left": ['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], "col_right": [2, 2, 2]})
print(df1)
print("*******************************************************")
print(df2)
print("*******************************************************")
# indicator默认为False,最后一列告诉你合并方式,_merge的名字可以修改, 把True改成自己的名字即可
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
print(res)
col1 col_left
0 0 a
1 1 b
*******************************************************
col1 col_right
0 1 2
1 2 2
2 2 2
*******************************************************
col1 col_left col_right _merge
0 0 a NaN left_only
1 1 b 2.0 both
2 2 NaN 2.0 right_only
3 2 NaN 2.0 right_only
import pandas as pd
import numpy as np
# 按照index合并
# merge:对两组的dataframe的key或者index进行合并。
# 创建两个dataframe
left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']},
index=['K0', 'K1', 'K2', 'K3'])
right = pd.DataFrame({
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=['K0', 'K1', 'K2', 'K3'])
print(left)
print("*******************************************************")
print(right)
print("*******************************************************")
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
print(res)
print("*******************************************************")
A B
K0 A0 B0
K1 A1 B1
K2 A2 B2
K3 A3 B3
*******************************************************
C D
K0 C0 D0
K1 C1 D1
K2 C2 D2
K3 C3 D3
*******************************************************
A B C D
K0 A0 B0 C0 D0
K1 A1 B1 C1 D1
K2 A2 B2 C2 D2
K3 A3 B3 C3 D3
*******************************************************
import pandas as pd
import numpy as np
# 与重读怎么合并,如下两个dataframe的age重复,怎么合并?
boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})
girls = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [4, 5, 6]})
print(boys)
print("*******************************************************")
print(girls)
print("*******************************************************")
# '_boy', '_girl'区分名字相同含义不同的数据
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
print(res)
# join的功能跟merge的功能很相似
k age
0 K0 1
1 K1 2
2 K2 3
*******************************************************
k age
0 K0 4
1 K1 5
2 K2 6
*******************************************************
k age_boy age_girl
0 K0 1 4
1 K1 2 5
2 K2 3 6
上面讲的都是数据,那么我们可不可以把这些数据通过图像的方式展示出来呢,可以的。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 随机生成1000个数据,线性的
data = pd.Series(np.random.randn(1000), index=np.arange(1000))
data = data.cumsum()
# 那数据方放到图上,data本来就是数据了,直接放在plot上面即可,具体plot的用法可自行google
data.plot()
plt.show()
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 随机生成1000个数据,矩阵
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
# 输出前5个数据
print(data.head(5))
# 累加便于查看图像,不然图像数据都堆在一块
data = data.cumsum()
data.plot()
plt.show()
A B C D
0 -0.841673 1.120628 -0.596660 0.943178
1 0.957905 -2.048079 0.090298 1.913352
2 -0.658881 -1.536420 1.184568 0.520136
3 -0.569689 -0.121283 2.189686 1.548651
4 0.902207 0.813209 1.860842 0.114137
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 随机生成1000个数据,矩阵
data = pd.DataFrame(np.random.randn(1000, 4), index=np.arange(1000), columns=list("ABCD"))
# 输出前5个数据
print(data.head(5))
# 累加便于查看图像,不然图像数据都堆在一块
data = data.cumsum()
# plot methods: bar, hist, box, area, kde, scatter, pie...
ax = data.plot.scatter(x='A', y='B', color='DarkBlue', label='Class 1')
# ax=ax表示 把这一组data赋值在ax中,就只在一张表上画两个图
data.plot.scatter(x='A', y='C', color='Darkred', label='Class 2', ax=ax)
plt.show()
A B C D
0 -2.031922 0.455693 0.668387 -1.897108
1 1.572124 -0.529235 0.123780 -0.206429
2 0.538136 1.539324 0.892129 -0.594824
3 -0.209559 0.255818 -0.134298 -0.290419
4 1.205846 -1.215146 0.467695 0.016468