赞
踩
- python原生数据结构:元组Tuple(),列表List[],集合Set{},字典Dictionary{A:B};
- NumPy包中的数据结构:数组Ndarray(带多种操作),矩阵Matrix(多种线性代数计算);
- Pandas包中的数据结构:序列Series(索引+1列数据),数据框DataFrame(索引+多列数据表)。
目录
Pandas中的数据结构,包括Series和DataFrame
NumPy中的数据结构,包括Ndarray、Matrix
import numpy as np
'运行
创建数组对象,在NumPy包中:
- import numpy as np
- array001 = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
- a2 = np.arange(5)
- a3 = np.ones((2,2))
- a4 = np.empty((2,2))
- a5 = np.random.rand(4,2)
- a6 = np.linspace(10,30,5)
- print('\n序列型数据转化得到数组:',array001,
- '\n显示该数据结构类型:',type(array001),
- '\narange()函数创建的数组:',a2,
- '\nones()函数创建的全1数组:\n',a3,
- '\nempty()函数创建的未赋值的数组:\n',a4,
- '\nrandom()函数创建的随机数组:\n',a5,
- '\nlinespace()函数创建的随机数组:',a6)
'运行
序列型数据转化得到数组: [ 1 2 3 4 5 6 7 8 9 10 11 12]
显示该数据结构类型: <class 'numpy.ndarray'>
arange()函数创建的数组: [0 1 2 3 4]
ones()函数创建的全1数组:
[[1. 1.]
[1. 1.]]
empty()函数创建的未赋值的数组:
[[0. 0.]
[0. 0.]]
random()函数创建的随机数组:
[[0.39902074 0.63298526]
[0.09231821 0.23007193]
[0.09899536 0.83000881]
[0.27760961 0.65135898]]
linespace()函数创建的随机数组: [10. 15. 20. 25. 30.]
- array002 = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
- print('\n一维数组索引:',array001[4:],
- '\n二维数组索引:',array002[1:3,2:4]) #2-3行、3-4列
一维数组索引: [ 5 6 7 8 9 10 11 12]
二维数组索引: [[ 7 8] [11 12]]
以下均为多维数组中的常用属性,其中,shape 可以返回对象的数据结构,例如行数与列数,除了返回一个表示数组各维度的元组,也可以通过 reshape 改变数组的结构
- array004 = array001.reshape(3,-1)
- print('\n改变结构后的数组\n',array004,
- '\n数组各个维度:',array004.shape,
- '\n数组结构类型:',array004.dtype,
- '\n数组数据个数:',array004.size,
- '\n数组数据类型字节数:',array004.itemsize,
- '\n数组维度:',array004.ndim)
改变结构后的数组
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
数组各个维度: (3, 4)
数组结构类型: int32
数组数据个数: 12
数组数据类型字节数: 4
数组维度: 2
- array003 = np.append(array002,[[1],[2],[3]],axis = 1) # axis = 1 按列方向添加
- print('\n增加一列后的数组\n',array003)
增加一列后的数组
[[ 1 2 3 4 1]
[ 5 6 7 8 2]
[ 9 10 11 12 3]]
- array003 = array002.T
- print('删除单行后的数组:\n',np.delete(array003,1,axis=0)) # axis=0删除行
- array003 = array002.T
- print('批量删除后的数组:\n',np.delete(array003,(1,3),0))
- array003 = array002.T
- print('删除单列后的数组\n',np.delete(array003,1,1)) # axis=1删除列
删除单行后的数组:
[[ 1 5 9]
[ 3 7 11]
[ 4 8 12]]
批量删除后的数组:
[[ 1 5 9]
[ 3 7 11]]
删除单列后的数组
[[ 1 9]
[ 2 10]
[ 3 11]
[ 4 12]]
- array002[1:2]=0
- print('数组批量赋值\n',array002)
- array003 = array002.T
- array003[1][1] = 100
- print('修改数值后的数组\n',array003)
数组批量赋值
[[ 1 2 3 4]
[ 0 0 0 0]
[ 9 10 11 12]]
修改数值后的数组
[[ 1 0 9]
[ 2 100 10]
[ 3 0 11]
[ 4 0 12]]
- arr1 = np.array([1,2,3])
- arr2 = np.array([4,5,6])
- print('纵向堆叠后:\n',np.vstack((arr1,arr2)),
- '\n横向堆叠后:\n',np.hstack((arr1,arr2)))
纵向堆叠后:
[[1 2 3]
[4 5 6]]
横向堆叠后:
[1 2 3 4 5 6]
- arr3 = np.array([[1,2,3],[4,5,6]])
- print('转换前的Ndarray是:\n',arr3)
- import pandas as pd
- dfFromNdarray = pd.DataFrame(arr3)
- print('Ndarray转化为DataFrame的结果是:\n',dfFromNdarray) #带行号和列号
转换前的Ndarray是:
[[1 2 3]
[4 5 6]]
Ndarray转化为DataFrame的结果是:
0 1 2
0 1 2 3
1 4 5 6
- arrFromDataFrame = dfFromNdarray.values
- print('DataFrame转化为Ndarry的结果是:\n',arrFromDataFrame) #只提取value值
DataFrame转化为Ndarry的结果是:
[[1 2 3]
[4 5 6]]
- array1 = [1,2,3]
- array2 = [6,7,8]
- array3 = [11,12,17]
- matrix = np.mat([array1,array2,array3])
- print('显示该数据结构类型:',type(matrix))
- print(matrix)
显示该数据结构类型: <class 'numpy.matrix'>
[[ 1 2 3]
[ 6 7 8]
[11 12 17]]
创建随机矩阵,在numpy中包含了许多创建特殊矩阵的方法,这里使用 empty() 方法创建一个新的数据随机的矩阵
- matrix1 = np.empty((3,3))
- print(matrix1)
[[ 0.00000000e+000 0.00000000e+000 0.00000000e+000]
[ 0.00000000e+000 0.00000000e+000 2.27270197e-321]
[ 9.30350261e+199 1.10343781e-312 -3.38460783e+125]]
- print('矩阵每维的大小:',matrix.shape)
- print('矩阵所有数据的个数:',matrix.size)
- print('矩阵每个数据的类型:',matrix.dtype)
矩阵每维的大小: (3, 3)
矩阵所有数据的个数: 9
矩阵每个数据的类型: int32
- mat1 = np.mat([[1,2],[3,4]])
- mat2 = np.mat([4,5])
- matrix_r = np.c_[mat1,mat2.T]
- print('将mat2矩阵添加在原矩阵右侧\n',matrix_r)
- matrix_l = np.c_[mat2.T,mat1]
- print('将mat2矩阵添加在原矩阵左侧\n',matrix_l)
- matrix_u = np.r_[np.mat([array1]),matrix]
- print('在原矩阵上方连接矩阵\n',matrix_u)
将mat2矩阵添加在原矩阵右侧
[[1 2 4]
[3 4 5]]
将mat2矩阵添加在原矩阵左侧
[[4 1 2]
[5 3 4]]
在原矩阵上方连接矩阵
[[ 1 2 3]
[ 1 2 3]
[ 6 7 8]
[11 12 17]]
- matrix2 = np.delete(matrix,1,axis = 1)
- print('删除第一行后的结果\n',matrix2)
- matrix3 = np.delete(matrix,1,axis=0)
- print('删除第一列后的结果\n',matrix3)
删除第一行后的结果
[[ 1 3]
[ 6 8]
[11 17]]
删除第一列后的结果
[[ 1 2 3]
[11 12 17]]
- mat3 = np.mat([[5,6],[7,8]])
- matrix4 = mat1*mat3
- print('矩阵乘法结果\n',matrix4)
- matrix5 = mat1.dot(mat3)
- print('矩阵点乘结果\n',matrix5)
矩阵乘法结果
[[19 22]
[43 50]]
矩阵点乘结果
[[19 22]
[43 50]]
矩阵常用函数。矩阵也可以使用 .T 进行转置。linalg.inv() 可以用于求逆运算,若不存在逆矩阵则报错。
- matrix6 = matrix.T
- matrix7 = np.linalg.inv(mat1)
- print('\n矩阵转置后:\n',matrix6,
- '\n矩阵求逆后:\n',matrix7)
矩阵转置后:
[[ 1 6 11]
[ 2 7 12]
[ 3 8 17]]
矩阵求逆后:
[[-2. 1. ]
[ 1.5 -0.5]]
求矩阵特征值(使用numpy必须是方阵)
- matrix8 = np.linalg.eig(matrix)
- print(matrix8)
(array([24.88734753, -0.8418908 , 0.95454327]), matrix([[-0.1481723 , -0.87920199, 0.10036602],
[-0.4447565 , 0.3814255 , -0.82855015],
[-0.88331004, 0.28551435, 0.550846 ]]))
- print('矩阵列表转换:\n',matrix.tolist(),
- '\n矩阵转数组:\n',np.array(matrix))
矩阵列表转换:
[[1, 2, 3], [6, 7, 8], [11, 12, 17]]
矩阵转数组:
[[ 1 2 3]
[ 6 7 8]
[11 12 17]]
import pandas as pd
'运行
- sdata = {'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
- s0 = pd.Series(sdata)
- print('利用字典生成的序列对象\n',s0)
- print('显示该数据结构类型:',type(s0))
- s1 = pd.Series([6,1,2,9])
- print('利用列表生成的序列对象\n',s1)
利用字典生成的序列对象
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
显示该数据结构类型: <class 'pandas.core.series.Series'>
利用列表生成的序列对象
0 6
1 1
2 2
3 9
dtype: int64
- s1 = pd.Series([6,1,2,9],index=['a','b','c','d'])
- print(s1)
a 6
b 1
c 2
d 9
dtype: int64
- print('序列的值\n',s0.values)
- print('序列的索引\n',s0.index)
- print('按照下标查找序列',s0[2])
- print('按照索引值查找元素',s0['Utah'])
- print('按照下标批量查找序列\n',s0[:2])
- print('按照索引值批量查找元素\n',s0[['Ohio','Oregon']])
序列的值
[35000 71000 16000 5000]
序列的索引
Index(['Ohio', 'Texas', 'Oregon', 'Utah'], dtype='object')
按照下标查找序列 16000
按照索引值查找元素 5000
按照下标批量查找序列
Ohio 35000
Texas 71000
dtype: int64
按照索引值批量查找元素
Ohio 35000
Oregon 16000
dtype: int64
- s2 = s1.append(pd.Series([12],index=['e']))
- print(s2)
a 6
b 1
c 2
d 9
e 12
dtype: int64
- s3 = s1.drop('a')
- print(s3)
dtype: int64
b 1
c 2
d 9dtype: int64
- s1['a'] = 4 #将s1中index为a的元素更改为4
- print(s1)
a 4
b 1
c 2
d 9
dtype: int64
print(s1.sort_values)
a 4
b 1
c 2
d 9
dtype: int64>
- print(s1)
- print('中位数为:'+str(s1.median()))
- print('大于序列中位数的数\n',s1[s1>s1.median()])
中位数为:3.0
大于序列中位数的数
a 4
d 9
dtype: int64
- s2 = pd.Series([4,3,5,8],index=['a','b','c','d'])
- print(s2+s1)
a 8
b 4
c 7
d 17
dtype: int64
- s3 = pd.Series([100,150,200])
- print('产生的序列是:\n',s3)
- idx = pd.date_range(start='2019-9',freq='M',periods=3)
- print('\n生成的时间序列是:\n',idx)
- s3.index = idx
- print('\n产生的时间序列是:\n',s3)
产生的序列是:
0 100
1 150
2 200
dtype: int64生成的时间序列是:
DatetimeIndex(['2019-09-30', '2019-10-31', '2019-11-30'], dtype='datetime64[ns]', freq='M')产生的时间序列是:
2019-09-30 100
2019-10-31 150
2019-11-30 200
Freq: M, dtype: int64
- dfFromSeries = s2.to_frame()
- print('Series转DataFrame\n',dfFromSeries)
- print('显示数据结构类型:',type(dfFromSeries))
Series转DataFrame
0
a 4
b 3
c 5
d 8
显示数据结构类型: <class 'pandas.core.frame.DataFrame'>
- dictFromSeries = s2.to_dict()
- print('Series转Dict\n',dictFromSeries)
- print('显示数据结构类型:',type(dictFromSeries))
Series转Dict
{'a': 4, 'b': 3, 'c': 5, 'd': 8}
显示数据结构类型: <class 'dict'>
引入pandas包,创建DataFrame对象。首先创建字典,之后使用 DataFrame() 方法创建数据框对象。通过index.name给其索引命名。最后使用 to_csv 和 to_excel 方法将其保存为csv和excel文件;也可以用列表进行创建:pd.DataFrame(data,columns,index)。
- dic1 = {'name':['Tom','Lily','Cindy','Petter'],'no':['001','002','003','004'],'age':[16,16,15,16],'gender':['m','f','f','m']}
- df1 = pd.DataFrame(dic1)
- print('显示该数据结构类型',type(df1))
- df1.index.name = 'id'
- #df1.to_csv('students.csv')
- #df1.to_excel('students.xls') !!!会报错
- print(df1)
显示该数据结构类型 <class 'pandas.core.frame.DataFrame'>
name no age gender
id
0 Tom 001 16 m
1 Lily 002 16 f
2 Cindy 003 15 f
3 Petter 004 16 m
- column = df1.no
- row = df1.loc[3]
- print('\n列数据索引\n',column,'\n行数据索引\n',row)
列数据索引
id
0 001
1 002
2 003
3 004
Name: no, dtype: object
行数据索引
name Petter
no 004
age 16
gender m
Name: 3, dtype: object
- print('修改前:\n',df1)
- df2 = df1.append([{'name':'Stark','no':'005','age':15,'gender':'m'}],ignore_index=True) #接着索引号为4,不写的话就是0
- print('增加行:\n',df2)
- df2['new_Col'] = [1,2,3,4,5]
- print('增加列:\n',df2)
修改前:
name no age gender
id
0 Tom 001 16 m
1 Lily 002 16 f
2 Cindy 003 15 f
3 Petter 004 16 m
增加行:
name no age gender
0 Tom 001 16 m
1 Lily 002 16 f
2 Cindy 003 15 f
3 Petter 004 16 m
4 Stark 005 15 m
增加列:
name no age gender new_Col
0 Tom 001 16 m 1
1 Lily 002 16 f 2
2 Cindy 003 15 f 3
3 Petter 004 16 m 4
4 Stark 005 15 m 5
- df3 = df1.copy()
- print('处理前的数据\n',df1)
- df3b = df3.drop(['name'],axis=1)
- print('删除列后的数据框\n',df3b)
- df3c = df3.drop([2])
- print('删除行后的数据框\n',df3c)
处理前的数据
name no age gender
id
0 Tom 001 16 m
1 Lily 002 16 f
2 Cindy 003 15 f
3 Petter 004 16 m
删除列后的数据框
no age gender
id
0 001 16 m
1 002 16 f
2 003 15 f
3 004 16 m
删除行后的数据框
name no age gender
id
0 Tom 001 16 m
1 Lily 002 16 f
3 Petter 004 16 m
- df4 = pd.DataFrame({'address':['school','home','school','school','home']})
- df5 = pd.concat([df2,df4],axis=1)
- print('合并前的df2\n',df2)
- print('合并前的df4\n',df4)
- print('合并后的df5\n',df5)
合并前的df2
name no age gender new_Col
0 Tom 001 16 m 1
1 Lily 002 16 f 2
2 Cindy 003 15 f 3
3 Petter 004 16 m 4
4 Stark 005 15 m 5
合并前的df4
address
0 school
1 home
2 school
3 school
4 home
合并后的df5
name no age gender new_Col address
0 Tom 001 16 m 1 school
1 Lily 002 16 f 2 home
2 Cindy 003 15 f 3 school
3 Petter 004 16 m 4 school
4 Stark 005 15 m 5 home
- df6 = pd.DataFrame({'name':['Tony'],'no':['005'],'age':[16],'gender':['m']})
- df7 = pd.concat([df1,df6],axis=0)
- print('合并前的df1\n',df1)
- print('合并前的df6\n',df6)
- print('合并后的df7\n',df7)
合并前的df1 name no age gender id 0 Tom 001 16 m 1 Lily 002 16 f 2 Cindy 003 15 f 3 Petter 004 16 m 合并前的df6 name no age gender 0 Tony 005 16 m 合并后的df7 name no age gender 0 Tom 001 16 m 1 Lily 002 16 f 2 Cindy 003 15 f 3 Petter 004 16 m 0 Tony 005 16 m
- i1 = pd.date_range('2019/9/21',periods=4,freq='7D')
- df10 = pd.read_csv('students.csv')
- df10.index = i1
- print(df10)
id name no age gender
2019-09-21 0 Tom 1 16 m
2019-09-28 1 Lily 2 16 f
2019-10-05 2 Cindy 3 15 f
2019-10-12 3 Petter 4 16 m
时间序列查询
print('\n根据时间序列索引得到的值\n',df10.loc['2019-09-21':'2019-09-30',['gender','age','name']])
根据时间序列索引得到的值
gender age name
2019-09-21 m 16 Tom
2019-09-28 f 16 Lily
- print('DataFrame转ndarray\n',df10.values,
- '\nDataFrame转series\n',df10['gender'])
DataFrame转ndarray
[[0 'Tom' 1 16 'm']
[1 'Lily' 2 16 'f']
[2 'Cindy' 3 15 'f']
[3 'Petter' 4 16 'm']]
DataFrame转series
2019-09-21 m
2019-09-28 f
2019-10-05 f
2019-10-12 m
Freq: 7D, Name: gender, dtype: object
- tup1=('Google','Runoob',1997,2000)
- tup2=(1,) #创建单个数字元组
- print("tup1[0]:",tup1[0]) #访问元组中第一各元素
- print("tup2[1:5]:",tup2[1:5])
tup1[0]: Google
tup2[1:5]: ()
- tup3=tup1+tup2
- tup4=tup2*3 #复制三份
'运行
- print("\n元组转列表:\n",list(tup1),
- "\n元组转字符串:\n",tup1.__str__())
- myset = set('aabc') #使用set()函数创建集合会自动的拆分多个字母组成的字符串
- print(myset)
- myset1 = set(('hello','world'))
- print(myset1)
{'a', 'c', 'b'}
{'hello', 'world'}
'a' in myset
'运行
- myset.add('ghk')
- myset.update('tyu') #一个一个元素添加
- print(myset)
{'t', 'b', 'a', 'ghk', 'c', 'y', 'u'}
- copy_myset=myset.copy()
- print('\nlen()返回集合的长度:',len(myset),
- '\ncopy()生成的集合:',copy_myset)
len()返回集合的长度: 7
copy()生成的集合: {'a', 'c', 'u', 't', 'ghk', 'b', 'y'}
- a = set('apple')
- b = set('banana')
- print ('\n求差集:',a-b,
- '\n求并集:',a|b,
- '\n求交集:',a&b,
- '\n求各自独特的:',a^b)
求差集: {'e', 'p', 'l'}
求并集: {'p', 'n', 'l', 'a', 'b', 'e'}
求交集: {'a'}
求各自独特的: {'n', 'p', 'l', 'b', 'e'}
- dict1={"ID":"L100","Name":"COCO"}
- students = [{'name':'n1','id':'001'},{'name':'n2','id':'002'},{'name':'n3','id':'003'}]
- print("显示该数据结构类型",type(dict1))
- print(dict1)
'运行
显示该数据结构类型 <class 'dict'>
{'ID': 'L100', 'Name': 'COCO'}
- demo_dict = dict(zip('abc','123'))
- print(demo_dict)
'运行
{'a': '1', 'b': '2', 'c': '3'}
- print('常规查询:',students[0]['id'])
- print('根据键查询:',students[0].get('id'))
'运行
常规查询: 001
根据键查询: 001
- students.append({'name':'n4','id':'004'})
- print('添加一个字典对象后:',students)
- students[0]['school']='school1'
- students[1]['school']='school2'
- students[2]['school']='school2'
- print('增加键值对后的字典:',students)
添加一个字典对象后: [{'name': 'n1', 'id': '001'}, {'name': 'n2', 'id': '002'}, {'name': 'n3', 'id': '003'}, {'name': 'n4', 'id': '004'}]
增加键值对后的字典: [{'name': 'n1', 'id': '001', 'school': 'school1'}, {'name': 'n2', 'id': '002', 'school': 'school2'}, {'name': 'n3', 'id': '003', 'school': 'school2'}, {'name': 'n4', 'id': '004'}]
- del students[3] #删除第4行(下标为3)
- print('删除列表中的一个字典对象后:\n',students)
- students[0].pop('id')
- print('删除一个键值对后:\n',students)
删除列表中的一个字典对象后
[{'name': 'n1', 'id': '001', 'school': 'school1'}, {'name': 'n2', 'id': '002', 'school': 'school2'}, {'name': 'n3', 'id': '003', 'school': 'school2'}]
删除一个键值对后
[{'name': 'n1', 'school': 'school1'}, {'name': 'n2', 'id': '002', 'school': 'school2'}, {'name': 'n3', 'id': '003', 'school': 'school2'}]
- for i in range(0,len(students)):
- students[i].pop('school')
- print(students)
[{'name': 'n1'}, {'name': 'n2', 'id': '002'}, {'name': 'n3', 'id': '003'}]
- students[0].update({'id':'001'})
- print('\n更新后的字典\n',students)
更新后的字典
[{'name': 'n1', 'id': '001'}, {'name': 'n2', 'id': '002'}, {'name': 'n3', 'id': '003'}]
- print("字典值转List:",list(demo_dict.values()))
- print("字典键转List:",list(demo_dict.keys()))
字典值转List: ['1', '2', '3']
字典键转List: ['a', 'b', 'c']
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。