Numpy & Pandas (数据处理教程)(莫烦听课笔记)

1.Numpy

维度 数学上叫 NumPy 中叫 例子
1维 向量 1维数组 [1,2,3]
2维 矩阵 2维数组 [[1,2],[3,4]]
3维+ 张量 多维数组 图片、视频数据

1.1Numpy数组

📌 一维数组

python 复制代码
import numpy as np

arr1 = np.array([1, 2, 3])
print(arr1.shape)   # (3,)  ------ 一维,3个元素

📌 二维数组(矩阵)

python 复制代码
arr2 = np.array([[1, 2, 3],
                 [4, 5, 6]])
print(arr2.shape)   # (2, 3)  ------ 2行3列

📌 三维数组(如彩色图片:高×宽×通道)

python 复制代码
arr3 = np.array([[[1, 2], [3, 4]],
                 [[5, 6], [7, 8]]])
print(arr3.shape)   # (2, 2, 2)  ------ 2层×2行×2列

📌 更高维

python 复制代码
arr4 = np.array([[[[1]]]])   # 四维
print(arr4.shape)   # (1, 1, 1, 1)

1.2 各种属性

1.2.1数组本身

python 复制代码
import numpy as np #numpy是基于矩阵的运算

array=np.array([[1,2,3],
              [2,3,4]]) #将列表转换成数组(矩阵)的方法

print(array)
print('number of dim:',array.ndim) #输出array是几维数组
print('shape:',array.shape) #输出array的行数是多少,列数是多少
print('size:',array.size) #array里有多少元素
复制代码
输出:
[[1 2 3]
 [2 3 4]]
number of dim: 2
shape: (2, 3)
size: 6
python 复制代码
import numpy as np

a=np.array([2,23,4]) #array元素之间用空格隔开
print(a) #array元素之间用空格隔开,和列表不同(用逗号隔开)
复制代码
[ 2 23  4]

1.2.2定义类型

python 复制代码
#可在创建时定义array的type(整数型,浮点型等)
a1=np.array([2,3,4],dtype=np.int) #整数型 np.int64
print(a1.dtype)

a2=np.array([2,3,4],dtype=np.float) #浮点型 np.float32
print(a2.dtype)
复制代码
int32
float64

1.2.3定义矩阵

python 复制代码
#定义矩阵
a=np.array([[1,2,3],[4,5,6]])
print(a)
复制代码
[[1 2 3]
 [4 5 6]]

1.2.4定义特殊矩阵

python 复制代码
#定义特殊矩阵
a=np.zeros((3,4)) #定义三行四列的零矩阵
print(a)

b=np.ones((2,3),dtype=np.int16) #定义2行3列的单位矩阵
print(b)

c=np.empty((3,4)) #定义空矩阵
print(c)

d=np.arange(10,20,2) #生成有序矩阵:起始值是10,终止值是20(不等于20),步长是2
print(d)
d2=np.arange(12).reshape((3,4)) #生成从0到11的3行4列矩阵
print(d2)

#生成线段
e=np.linspace(1,10,5) #从1到10生成5段的数列
print(e)
e2=np.linspace(1,10,6).reshape((2,3)) #更改形状:2行3列矩阵
print(e2)
复制代码
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[[1 1 1]
 [1 1 1]]
[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[10 12 14 16 18]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[ 1.    3.25  5.5   7.75 10.  ]
[[ 1.   2.8  4.6]
 [ 6.4  8.2 10. ]]

1.3 基础运算

python 复制代码
import numpy as np
a=np.array([10,20,30,40])
b=np.arange(4)
print(a,b)
c=a-b #矩阵减法
print(c)
复制代码
[10 20 30 40] [0 1 2 3]
[10 19 28 37]
python 复制代码
c=a+b #矩阵加法
print(c)
复制代码
[10 21 32 43]
python 复制代码
c=b**2 #在Python中平方、次方用**
print(c)
复制代码
[0 1 4 9]
python 复制代码
c=10*np.sin(a) #三角函数,通过调用numpy中的函数
print(c)
复制代码
[-5.44021111  9.12945251 -9.88031624  7.4511316 ]
python 复制代码
print(b)
print(b<3) #判断b中哪些值是小于3的,返回元素为布尔型的列表
复制代码
[0 1 2 3]
[ True  True  True False]
python 复制代码
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
print(b)
复制代码
[[1 1]
 [0 1]]
[[0 1]
 [2 3]]
python 复制代码
c=a*b #逐位相乘
print(c)

c_dot=np.dot(a,b)
c_dot1=a.dot(b)
print(c_dot) #矩阵相乘
print(c_dot1) #另一种写法
复制代码
[[0 1]
 [0 3]]
[[2 4]
 [2 3]]
[[2 4]
 [2 3]]
python 复制代码
a=np.random.random((2,4)) #随机创建一个2行4列的矩阵
print(a)
print(np.sum(a)) #矩阵所有元素之和
print(np.min(a)) #矩阵最小元素
print(np.max(a)) #矩阵最大元素

print(np.sum(a,axis=1)) #axis表示维度,axis=1对行求和
print(np.sum(a,axis=0)) #axis=0对列求和
#关于axis这个属性的定义是基于数组.shape 的这个属性,
#它是一个Python元组,对于二维数组而言,axis=0表示这个元组的第一个元素,axis=1表示第二个元素.
#假如这个数组是三维数组,axis=0代表的是第一个维度也就是页,axis=1,表示的是行,axis=2表示列
复制代码
[[0.03021769 0.2205137  0.71329625 0.13152101]
 [0.24729601 0.37339794 0.16424974 0.1769258 ]]
2.057418144568723
0.03021768837981753
0.7132962510835831
[1.09554865 0.9618695 ]
[0.2775137  0.59391164 0.877546   0.30844681]
python 复制代码
A=np.arange(2,14).reshape((3,4))
print(A)
print(np.argmin(A)) #搜索最小值的索引
print(np.argmax(A)) #搜索最大值的索引
print(np.mean(A)) #矩阵平均值
print(A.mean()) #矩阵平均值另一种方法
print(np.average(A)) #矩阵加权平均值,尽量用mean()
print(np.median(A)) #矩阵中位数
print(np.cumsum(A)) #累加,结果元素个数与A相同,第二个数是A前两个值想加,第k个数是A前k个数相加
print(np.diff(A)) #累差,A是3*4,累差结果为3*3,相邻两个数之间的差

print(np.nonzero(A)) #返回非零数的索引,第一个array表示行,第二个array表示列

print(np.sort(A)) #矩阵逐行排序

print(np.transpose(A)) #矩阵转置
print(A.T) #矩阵转置另一种方法
print((A.T).dot(A)) #矩阵乘法示例

print(np.clip(A,5,9)) #滤波,在A中,比5小的数都变成5,比9大的数都变成9,5-9的数保留

print(np.mean(A,axis=0)) #axis=0对列求均值
print(np.mean(A,axis=1)) #axis=1对行求均值

输出

python 复制代码
[[ 2  3  4  5]
 [ 6  7  8  9]
 [10 11 12 13]]
0
11
7.5
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]]
[[140 158 176 194]
 [158 179 200 221]
 [176 200 224 248]
 [194 221 248 275]]
[[5 5 5 5]
 [6 7 8 9]
 [9 9 9 9]]
[6. 7. 8. 9.]
[ 3.5  7.5 11.5]

1.4索引

python 复制代码
import numpy as np
A=np.arange(3,15) #一维array
print(A)
print(A[3])
复制代码
[ 3  4  5  6  7  8  9 10 11 12 13 14]
6
python 复制代码
A=np.arange(3,15).reshape((3,4)) #二维array
print(A)
print(A[2])
print(A[0][3])
print(A[0,3])
 #用冒号:代替该行(列)所有的数
#左闭右开
print(A[2,:])
print(A[:,1])
print(A[1,1:3]) #输出A[1][1],A[1][2]
复制代码
[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
[11 12 13 14]
6
6
[11 12 13 14]
[ 4  8 12]
[8 9]
python 复制代码
for row in A: #迭代每一行
    print(row)
#因为系统没有专门的迭代每一列,所以可以将矩阵先转置
for column in A.T: #迭代每一列
    print(column)
#将矩阵转换成列表/1*n
print(A.flatten()) #A.flat()返回的是一个object,也就是迭代器
for item in A.flat: #迭代每一项
    print(item)
复制代码
[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]
3
4
5
6
7
8
9
10
11
12
13
14

1.5array合并

python 复制代码
import numpy as np

A=np.array([1,1,1])
B=np.array([2,2,2])

print(np.vstack((A,B))) #上下合并 vertical垂直合并

print(np.hstack((A,B))) #左右合并 horizontal水平合并

print(A.T) #定义的是数组,不是矩阵,转置不了
print(A[np.newaxis,:]) #给数组A添加维度,此时变成了一维矩阵1*3:向量
print(A[:,np.newaxis]) #变成了3*1的矩阵
复制代码
[[1 1 1]
 [2 2 2]]
[1 1 1 2 2 2]
[1 1 1]
[[1 1 1]]
[[1]
 [1]
 [1]]
python 复制代码
#先将array添加维度,不然没有axis=1这个维度
A=np.array([1,1,1])[:,np.newaxis]
B=np.array([2,2,2])[:,np.newaxis]

C=np.concatenate((A,B,B,A),axis=0) #多个array合并,同时可指定哪个方向上
#axis=0,对行操作(增加行),垂直合并
#axis=1,对列操作(增加列),水平合并
print(C)
复制代码
[[1]
 [1]
 [1]
 [2]
 [2]
 [2]
 [2]
 [2]
 [2]
 [1]
 [1]
 [1]]

1.6分割

python 复制代码
import numpy as np

A=np.arange(12).reshape((3,4))
print(A)

#等量分割
print(np.split(A,2,axis=1)) #对列进行操作,将A均分成2快
print(np.split(A,3,axis=0)) #对行进行操作,将A均分成3块

#不等量分割
print(np.array_split(A,3,axis=1))

print(np.vsplit(A,3)) #垂直分割 
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]])]

1.7 numpy-copy&deepcopy.ipynb

python 复制代码
import numpy as np
a=np.arange(4)
print(a)
#此时abcd其实是相互关联的
b=a
c=a
d=b
a[0]=10
print(a)
b is a
d is a
复制代码
[0 1 2 3]
[10  1  2  3]
True True
python 复制代码
b=a.copy() #deep copy,把a的值赋给b,但a,b不关联
a[2]=44
print(a)
print(b)
复制代码
[10  1 44  3]
[10  1 2  3]

2.pandas

2.1 pandas基础介绍

python 复制代码
#numpy:提供序列化好了的矩阵(序列)
#pandas:类似于一个字典形式的numpy,若numpy是列表的话,pandas就相当于字典
        #pandas可以给不同的行,不同的列命名
import pandas as pd
import numpy as np

s=pd.Series([1,3,6,np.nan,44,1]) #定义一个序列,[]内是每个元素的值,默认浮点型
print(s)
复制代码
0     1.0
1     3.0
2     6.0
3     NaN
4    44.0
5     1.0
dtype: float64
复制代码
DatetimeIndex(['2020-03-19', '2020-03-20', '2020-03-21', '2020-03-22',
               '2020-03-23'],
              dtype='datetime64[ns]', freq='D')
python 复制代码
#数据表 DataFrame
#np.random.randn(5,4)生成一个 5 行 4 列的随机数组,数组中的每个数都服从"标准正态分布"。
df=pd.DataFrame(np.random.randn(5,4),index=dates,columns=['a','b','c','d']) 
#没有给行或列的名字时,pandas默认成0123...,如果给了,按照给定的排序
#DataFrame是一个大的matrix,类似于一个二维numpy
#np.random.random(6,4)其实就是numpy的数据
#index是行索引,columns是列索引
df

df1=pd.DataFrame(np.arange(12).reshape(3,4))
df1

#用字典生成DataFrame,字典中的一对key和value表示一列
df2=pd.DataFrame({'A':1,
                 'B':pd.Timestamp('20200319'),
                 'C':pd.Series(1,index=list(range(4)),dtype='float32'),
                 'D':np.array([3]*4,dtype='int32'),
                 'E':pd.Categorical(["test","train","test","train"]),
                 'F':'fool'})
print(df2)
print(df2.dtypes) #返回每一列的类型

print(df2.index) #返回所有行的序号
print(df2.columns) #返回所有列的名称
print(df2.values) #返回DataFrame中的所有值

df2.describe() #描述DataFrame,如均值,最大值,最小值等
#只能计算数值型,所以字符型都自动忽略

df2.T #将df2视为矩阵,进行转置

df2.sort_index(axis=0,ascending=False) 
#排序函数此时用sort_index(),但与上文行索引index无关联
#axis=0,对行操作(行动),axis=1,对列操作(列动)
#ascending=False表示倒序

df2.sort_values(by='E') #根据表格中的值进行排序,根据'E'列的值进行排序
复制代码
   A          B    C  D      E     F
0  1 2020-03-19  1.0  3   test  fool
1  1 2020-03-19  1.0  3  train  fool
2  1 2020-03-19  1.0  3   test  fool
3  1 2020-03-19  1.0  3  train  fool
A             int64
B    datetime64[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 Timestamp('2020-03-19 00:00:00') 1.0 3 'test' 'fool']
 [1 Timestamp('2020-03-19 00:00:00') 1.0 3 'train' 'fool']
 [1 Timestamp('2020-03-19 00:00:00') 1.0 3 'test' 'fool']
 [1 Timestamp('2020-03-19 00:00:00') 1.0 3 'train' 'fool']]

| | A | B | C | D | E | F |
| 0 | 1 | 2020-03-19 | 1.0 | 3 | test | fool |
| 2 | 1 | 2020-03-19 | 1.0 | 3 | test | fool |
| 1 | 1 | 2020-03-19 | 1.0 | 3 | train | fool |

3 1 2020-03-19 1.0 3 train fool

2.2 pandas选择数据

python 复制代码
import pandas as pd
import numpy as np

dates=pd.date_range('20200319',periods=6)
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])

print(df)

#选择特定的某一列
print(df['A'])
print(df.A)

#按照切片进行选择
print(df[0:3]) #选取0到3行
print(df['20200320':'20200323']) #选取'20200320'到'20200323'列

#更高级的方法select by label:loc根据标签(行名和列名)进行选择
print(df.loc['20200322'])
print(df.loc[:,['A','B']]) #保留所有行,列选取'A'和'B'
print(df.loc['20200322',['A','B']])
复制代码
             A   B   C   D
2020-03-19   0   1   2   3
2020-03-20   4   5   6   7
2020-03-21   8   9  10  11
2020-03-22  12  13  14  15
2020-03-23  16  17  18  19
2020-03-24  20  21  22  23
2020-03-19     0
2020-03-20     4
2020-03-21     8
2020-03-22    12
2020-03-23    16
2020-03-24    20
Freq: D, Name: A, dtype: int32
2020-03-19     0
2020-03-20     4
2020-03-21     8
2020-03-22    12
2020-03-23    16
2020-03-24    20
Freq: D, Name: A, dtype: int32
            A  B   C   D
2020-03-19  0  1   2   3
2020-03-20  4  5   6   7
2020-03-21  8  9  10  11
             A   B   C   D
2020-03-20   4   5   6   7
2020-03-21   8   9  10  11
2020-03-22  12  13  14  15
2020-03-23  16  17  18  19
A    12
B    13
C    14
D    15
Name: 2020-03-22 00:00:00, dtype: int32
             A   B
2020-03-19   0   1
2020-03-20   4   5
2020-03-21   8   9
2020-03-22  12  13
2020-03-23  16  17
2020-03-24  20  21
A    12
B    13
Name: 2020-03-22 00:00:00, dtype: int32
python 复制代码
#select by position:iloc根据位置(第几行第几列)进行选择
print(df.iloc[3]) #选择第四行的数据
print(df.iloc[3,1]) #第4行,第2列
print(df.iloc[2:4,1:3]) #第3行到第4行,第2列到第3列 
#!!!x:y,起始值是x,但终点值是y-1
print(df.iloc[[1,3,5],1:3]) #不连续的选取
复制代码
A    12
B    13
C    14
D    15
Name: 2020-03-22 00:00:00, dtype: int32
13
             B   C
2020-03-21   9  10
2020-03-22  13  14
             B   C
2020-03-20   5   6
2020-03-22  13  14
2020-03-24  21  22
python 复制代码
#Boolean indexing
print(df)
print(df[df.A<8]) #列名为A的列中,<8的数被输出来
print(df[df.A<8][df.B>4])
复制代码
             A   B   C   D
2020-03-19   0   1   2   3
2020-03-20   4   5   6   7
2020-03-21   8   9  10  11
2020-03-22  12  13  14  15
2020-03-23  16  17  18  19
2020-03-24  20  21  22  23
            A  B  C  D
2020-03-19  0  1  2  3
2020-03-20  4  5  6  7
            A  B  C  D
2020-03-20  4  5  6  7

2.3 pandas设置值

python 复制代码
import pandas as pd
import numpy as np

dates=pd.date_range('20200319',periods=6)
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])

df.iloc[2,2]=111 #根据iloc(位置) 将第3行第3列的数改为111
df.loc['20200322','B']=3435 #根据loc(名称label)

df[df.A>4]=1 #A列大于4的元素所在的行,值都改为1

print(df)
复制代码
            A  B  C  D
2020-03-19  0  1  2  3
2020-03-20  4  5  6  7
2020-03-21  1  1  1  1
2020-03-22  1  1  1  1
2020-03-23  1  1  1  1
2020-03-24  1  1  1  1
python 复制代码
df.A[df.A<4]=2 #找到A列中小于4的元素所在的行,A列里元素都改为2(.A表示只修改A,其他地方不动)
print(df)
复制代码
            A  B  C  D
2020-03-19  2  1  2  3
2020-03-20  4  5  6  7
2020-03-21  2  1  1  1
2020-03-22  2  1  1  1
2020-03-23  2  1  1  1
2020-03-24  2  1  1  1
python 复制代码
df.B[df.A<4]=3 #找到A列中小于4的元素所在的行,B列里元素都改为3(.B表示只修改A,其他地方不动)
print(df)
复制代码
            A  B  C  D
2020-03-19  2  3  2  3
2020-03-20  4  5  6  7
2020-03-21  2  3  1  1
2020-03-22  2  3  1  1
2020-03-23  2  3  1  1
2020-03-24  2  3  1  1
python 复制代码
df['F']=np.nan
#新添加了F列,所有值都是NaN
#之后再根据某行某列等方法,将F列的值一个一个输入
print(df)
复制代码
            A  B  C  D   F
2020-03-19  2  3  2  3 NaN
2020-03-20  4  5  6  7 NaN
2020-03-21  2  3  1  1 NaN
2020-03-22  2  3  1  1 NaN
2020-03-23  2  3  1  1 NaN
2020-03-24  2  3  1  1 NaN
python 复制代码
#和原有的序列纵坐标相同
df['E']=pd.Series([1,2,3,4,5,6],index=pd.date_range('20200319',periods=6))
#添加列的同时指定值
print(df)
复制代码
            A  B  C  D   F  E
2020-03-19  2  3  2  3 NaN  1
2020-03-20  4  5  6  7 NaN  2
2020-03-21  2  3  1  1 NaN  3
2020-03-22  2  3  1  1 NaN  4
2020-03-23  2  3  1  1 NaN  5
2020-03-24  2  3  1  1 NaN  6

2.4处理丢失数据

python 复制代码
import pandas as pd
import numpy as np

dates=pd.date_range('20200319',periods=6)
df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D'])
df.iloc[0,1]=np.nan #假设丢失掉的数据
df.iloc[1,2]=np.nan

print(df)

#丢弃 drop
print(df.dropna(axis=0,how='any')) #任何一行有NaN都被丢弃
#axis=0丢掉行,axis=1丢掉列
#how={'any'(默认),'all'} all表示一行(列)所有数据都是NaN时,才会被丢弃
复制代码
             A     B     C   D
2020-03-19   0   NaN   2.0   3
2020-03-20   4   5.0   NaN   7
2020-03-21   8   9.0  10.0  11
2020-03-22  12  13.0  14.0  15
2020-03-23  16  17.0  18.0  19
2020-03-24  20  21.0  22.0  23
             A     B     C   D
2020-03-21   8   9.0  10.0  11
2020-03-22  12  13.0  14.0  15
2020-03-23  16  17.0  18.0  19
2020-03-24  20  21.0  22.0  23
python 复制代码
#填充 fill
print(df.fillna(value=0)) #NaN用0填入
复制代码
             A     B     C   D
2020-03-19   0   0.0   2.0   3
2020-03-20   4   5.0   0.0   7
2020-03-21   8   9.0  10.0  11
2020-03-22  12  13.0  14.0  15
2020-03-23  16  17.0  18.0  19
2020-03-24  20  21.0  22.0  23
python 复制代码
#判断数据有没有缺失
print(df.isnull()) #缺失返回True
#当表格很大,很难找到哪里有True时
print(np.any(df.isnull())==True) #,返回False表示没有丢失,返回True表示该表格中至少有一个数据丢失
复制代码
                A      B      C      D
2020-03-19  False   True  False  False
2020-03-20  False  False   True  False
2020-03-21  False  False  False  False
2020-03-22  False  False  False  False
2020-03-23  False  False  False  False
2020-03-24  False  False  False  False
True

2.5导入导出数据.

python 复制代码
import pandas as pd

#读取excel文件
data=pd.read_csv('student.csv',encoding='UTF-8')
print(data)

#存储文件
data.to_pickle('student.pickle')

2.6合并concat.

python 复制代码
import pandas as pd
import numpy as np

#concatenating
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'])

print(df1)
print(df2)
print(df3)
复制代码
     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
     a    b    c    d
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
     a    b    c    d
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
python 复制代码
#用shape去记忆axis,要改变shape中哪一维的大小,axis就选几,numpy和pandas都一样
#如原shape为(3,4),合并后为(6,4),改变第一个位置的值,所以axis=0
#合并
result=pd.concat([df1,df2,df3],axis=0) #合并,axis=0对行操作,行变多
print(result) #行索引还是原来的没有变化

result=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
print(result) #生成新的有序索引
复制代码
     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
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
python 复制代码
#concat()的一个参数,join,有两种形式,['inner','outer']
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=['c','d','e','f'],index=[2,3,4]) 
#df1和df2的行和列不完全一致,合并时用join可以很好的处理
print(df1)
print(df2)
result1=pd.concat([df1,df2],join='outer') #合并后保留所有不重复的行和列,不存在的元素用NaN填充
print(result1) #类似于并集

result2=pd.concat([df1,df2],join='inner',ignore_index=True) #合并后保留共同的部分
print(result2) #类似于交集

#处理序号仍然可以用ignore_index=True
复制代码
     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
     c    d    e    f
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    f
1  0.0  0.0  0.0  0.0  NaN  NaN
2  0.0  0.0  0.0  0.0  NaN  NaN
3  0.0  0.0  0.0  0.0  NaN  NaN
2  NaN  NaN  1.0  1.0  1.0  1.0
3  NaN  NaN  1.0  1.0  1.0  1.0
4  NaN  NaN  1.0  1.0  1.0  1.0
     c    d
0  0.0  0.0
1  0.0  0.0
2  0.0  0.0
3  1.0  1.0
4  1.0  1.0
5  1.0  1.0
python 复制代码
#append 添加一行(列)数据
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=['c','d','e','f'],index=[2,3,4]) 
result1=df1.append([df2,df2],ignore_index=True) #将两个df2接到df1后,竖着接
print(result1)

s=pd.Series([1,2,3,4],index=['a','b','c','d'])
result=df1.append(s,ignore_index=True) #追加一行,而不是一个表
print(result)
复制代码
     a    b    c    d    e    f
0  0.0  0.0  0.0  0.0  NaN  NaN
1  0.0  0.0  0.0  0.0  NaN  NaN
2  0.0  0.0  0.0  0.0  NaN  NaN
3  NaN  NaN  1.0  1.0  1.0  1.0
4  NaN  NaN  1.0  1.0  1.0  1.0
5  NaN  NaN  1.0  1.0  1.0  1.0
6  NaN  NaN  1.0  1.0  1.0  1.0
7  NaN  NaN  1.0  1.0  1.0  1.0
8  NaN  NaN  1.0  1.0  1.0  1.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  2.0  3.0  4.0

2.7合并merge

python 复制代码
#concat相对于merge,是一种比较简单的合并
#maerge在考虑索引或者key的对照下,实现DataFrame的合并
import pandas as pd
import numpy as np

#merge two df by key/keys(maybe used in database)
#simple example
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(right)
res=pd.merge(left,right,on='key') #on='key'基于key列合并
print(res)
复制代码
  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
python 复制代码
#merge two df by key/keys (maybe used in database)
#consider two keys
left=pd.DataFrame({'key1':['K0','K0','K1','K2'],
                   'key2':['K0','K1','K0','K1'],
                  'A':['A0','A1','A2','A3'],
                  'B':['B0','B1','B2','B3']})
right=pd.DataFrame({'key1':['K0','K1','K1','K2'],
                    'key2':['K0','K0','K0','K0'],
                  'C':['C0','C1','C2','C3'],
                  'D':['D0','D1','D2','D3']})
print(left)
print(right)
#how=['left','right','inner','outer']
res1=pd.merge(left,right,on=['key1','key2']) #how默认为inner,合并后保留相同的部分
#在left中'K1,K0'只有一组对应'A2,B2',但right有两组'K1,K0',所以'A2,B2'出现了两遍
res2=pd.merge(left,right,on=['key1','key2'],how='right') #基于right的keys合并(即right的keys全保留)
print(res2)
复制代码
  key1 key2   A   B
0   K0   K0  A0  B0
1   K0   K1  A1  B1
2   K1   K0  A2  B2
3   K2   K1  A3  B3
  key1 key2   C   D
0   K0   K0  C0  D0
1   K1   K0  C1  D1
2   K1   K0  C2  D2
3   K2   K0  C3  D3
  key1 key2    A    B   C   D
0   K0   K0   A0   B0  C0  D0
1   K1   K0   A2   B2  C1  D1
2   K1   K0   A2   B2  C2  D2
3   K2   K0  NaN  NaN  C3  D3
python 复制代码
#merge two df by key/keys (maybe used in database)
#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(df2)
res=pd.merge(df1,df2,on='col1',how='outer',indicator=True) 
#indicator会显示每行merge的方式,indicator默认为False
print(res)
#显示结果多了label是'merge'的一列,其中为left_only表示只有左边有数据,右边没有数据
#merge(x,y),x是左边,y是右边

#将indicator默认的列名'merge',改为自定义的
res1=pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column') 
print(res1)
复制代码
   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
   col1 col_left  col_right indicator_column
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
python 复制代码
#merge by index
left=pd.DataFrame({'A':['A0','A1','A2'],
                  'B':['B0','B1','B2']},
                  index=['K0','K1','K2'])
right=pd.DataFrame({ 'C':['C0','C1','C2'],
                  'D':['D0','D1','D2']},
                  index=['K0','K2','K3'])
print(left)
print(right)

#left_index和right_index,默认值都是False
#当把他们都设为True时,表示不再根据列中的'key'进行合并,而是调转方向,根据行名来merge
res1=pd.merge(left,right,left_index=True,right_index=True,how='outer')
print(res1)
复制代码
     A   B
K0  A0  B0
K1  A1  B1
K2  A2  B2
     C   D
K0  C0  D0
K2  C1  D1
K3  C2  D2
      A    B    C    D
K0   A0   B0   C0   D0
K1   A1   B1  NaN  NaN
K2   A2   B2   C1   D1
K3  NaN  NaN   C2   D2
python 复制代码
#处理overlapping
boys=pd.DataFrame({'k':['K0','K1','K2'],'age':[1,2,3]})
girls=pd.DataFrame({'k':['K0','K0','K3'],'age':[4,5,6]})
print(boys)
print(girls)
#'age'该列名重复
res=pd.merge(boys,girls,on='k',suffixes=['_boy','_girl'],how='outer')
#suffixes修改列名(加后缀)
print(res)
复制代码
    k  age
0  K0    1
1  K1    2
2  K2    3
    k  age
0  K0    4
1  K0    5
2  K3    6
    k  age_boy  age_girl
0  K0      1.0       4.0
1  K0      1.0       5.0
2  K1      2.0       NaN
3  K2      3.0       NaN
4  K3      NaN       6.0

2.8plot画图

python 复制代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

#plot data
#Series线性数据
data=pd.Series(np.random.randn(1000),index=np.arange(1000))
data=data.cumsum() #data中的数据累加

data.plot()
plt.show()
python 复制代码
#DataFrame数据表
data=pd.DataFrame(np.random.randn(1000,4),
                 index=np.arange(1000),
                 columns=list('ABCD'))
data=data.cumsum()
print(data.head())
data.plot()
#data.plot()中有很多参数,线条形状颜色等等,自己google
plt.show()
复制代码
          A         B         C         D
0 -1.407811  0.164888 -0.858803 -0.217948
1 -1.323665 -0.058319 -1.588471  0.542279
2 -2.152346 -0.327931 -0.698983 -0.541206
3 -1.357743  1.626128  1.190956  0.988664
4 -0.275740  1.231384  1.318562  0.986995
python 复制代码
#plot methods:
#'bar','hist','box','kde','area','scatter','hexbin','pie'
#scatter只能有两个对象x和y,而不能像data.plot()一样可以同时画出很多列数据
ax=data.plot.scatter(x='A',y='B',color='DarkBlue',label='class1') #画散点图
data.plot.scatter(x='A',y='C',color='DarkGreen',label='class2',ax=ax)
plt.show()
python 复制代码
data.plot.hist()
plt.show()
相关推荐
m沐沐11 天前
【计算机视觉】OpenCV 模板匹配银行卡数字识别---下
人工智能·python·opencv·计算机视觉·pycharm·numpy
李昊哲小课12 天前
PyArrow 完整教程
大数据·数据分析·pandas·pyarrow
云和数据.ChenGuang13 天前
T5大模型
人工智能·机器人·pandas·数据预处理·数据训练
云和数据.ChenGuang13 天前
大模型厂商常用的数据库有哪些?
数据库·人工智能·pytorch·深度学习·numpy
MATLAB代码顾问14 天前
Python Pandas数据分析入门指南
python·数据分析·pandas
MATLAB代码顾问14 天前
Python NumPy数值计算核心指南
开发语言·python·numpy
FBI HackerHarry浩14 天前
解决pip 安装 numpy 时元数据生成失败
numpy·pip
themingyi16 天前
Abaqus2024安装python包pandas
开发语言·python·pandas
一晌小贪欢16 天前
第26节:自动化办公——利用 Python 自动生成动态分析报告 (PPT/PDF)
开发语言·python·数据分析·自动化·powerpoint·pandas·数据可视化
留白_16 天前
pandas练习题
python·数据分析·pandas