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()
相关推荐
绛橘色的日落(。・∀・)ノ14 小时前
Numpy 第五章 数学函数
numpy
书到用时方恨少!17 小时前
Python Pandas 使用指南:数据分析的瑞士军刀
python·数据分析·pandas
鱼骨不是鱼翅18 小时前
Numpy
numpy
乖巧的妹子1 天前
numpy.nan Nan
numpy
绛橘色的日落(。・∀・)ノ1 天前
Numpy 第四章 逻辑函数
numpy
绛橘色的日落(。・∀・)ノ1 天前
Pandas 第九章 分类数据
pandas
MediaTea2 天前
Pandas :索引机制与数据访问
pandas
world-wide-wait2 天前
机器学习04——numpy
人工智能·机器学习·numpy
书到用时方恨少!2 天前
Python NumPy 使用指南:科学计算的基石
开发语言·python·numpy