一、基础
1.1 数据类型和新建文件
数据类型 | 新建方法 |
csv 和 txt | pd.to_csv |
excel | pd.to_excel |
sql | pd.to_sql |
import pandas as pd路径 = 'c:/Users/xx/song.csv'数据 = pd.DataFrame({'序号':[1,2,3],'姓名':['小米','小华','小名']})数据 = 数据.set_index('序号')数据.to_csv(路径)print('新建song.csv成功')
1.2 读取txt和csv文件
read_csv 默认逗号作为分隔符
read_table 默认制表符作为分隔符
import pandas as pd路径 = 'c:/Users/xx/读取文件.txt'读取数据 = pd.read_table(路径,sep=',') #制表符 分隔符是逗号 读取数据 = pd.read_csv() print(读取数据)表格中既有逗号分隔又有制表符分隔 需要用到正则表达式 s+ (+)匹配1次或者无限次 重复在+号之前的数据
匹配空白字符(包括空格 换行符 制表符等,相当于\t \n \r \f \v)人造表头 通过header=None,names=['','','','',''] 实现import pandas as pd路径 = 'c:/Users/xx/读取文件.txt'读取文件 = pd.read_csv(路径,header=None,names=['性别','姓名','地址','入职日期'],index_col='入职日期',nrows=3)索引类列可以是index_col='入职日期'如果是多个索引可以是index-col=['','']nrows() 显示前几行 只有结果是前3行 print(3) 显示的来的结果只是展示了3行 都有的将txt文件转化为csv文件imprt pandas as pd数据= pd.read_csv('C:/Users/xx/读取文件.txt')数据.to_csv('C:/Users/xx/读取文件.csv')print(数据)
import pandas as pd路径 = 'c:/Users/xx/读取文件.txt'读取文件 = pd.read_csv(路径)# print(读取文件.head(3)) #显示几行数据# print(读取文件.shape) 查看几行几列# print(读取文件.columns) 显示列名# print(读取文件.index) 显示索引号# print(读取文件.dtypes) 每一列的数据类型
参数 | 描述 |
sep | 分隔符或者正则表达式sep='\s+' |
header | 列名的标号,默认0(第一行),如果没有列名应该为None |
names | 列名,与header=None一起使用 |
index_col | 索引的列号或者列名,可以是一个单一的名字或者是数字,也可以是一个分层索引 |
encoding | 文本编码,例如utf-8 |
nrows | 从文件开头处读入的行数 |
skiprows | 从文件开始处,需要跳过的行数或者行号列表 |
1.3 mysql 连接数据库
import pymysql连接对象 = pymysql.connect(host='localhost',user='root',password='123456',database='test')游标对象=连接对象.cursor()sql=''游标对象.execute(sql)游标对象.close()连接对象.commit()连接对象.close()
pandas连接数据库
import pandas as pdimport pymysql连接对象 = pymysql.connect(host='localhost',user='root',password='123456',database='sys',charset='utf8')读取文件 = pd.read_sql("select * from 小类",con=连接对象)print(读取文件)
1.4 pandas 读取与修改excel
import pandas as pd路径 = 'C:/Users/xx/song.xlsx'数据 = pd.read_excel(路径,header=None,names=['品牌','人数','地区'],index_col='品牌')print(数据)数据.to_excel(路径)
二、pandas数据类型
2.1 Series DataFrame
DataFrame :二维数据,,整个表格,多行多列
df.index:索引列
df.colcumns:列名
Series:一维数据,一行或者一列
字典的形式import pandas as pd字典 = {'姓名':'松松','性别':'女','年龄':'20','地址':'某默默'}数据 = pd.Series(字典)# 数据 = pd.Series(['松松','女',20,'2020-1-1'],index=['a','b','c']) #index=['',''] 指定索引# print(数据.index) #索引# print(数据.values) #查看值 信息# print(数据.index)# print(数据['姓名']) #一个key值# print(type(数据[['姓名','性别']])) #多个key值import pandas as pd列表1 = ['姓名','年龄','性别','身高']列表2 = ['松松','20','女','168']数据 = pd.Series(列表2,index=列表1) #列表1作为索引print(数据)import pandas as pd
路径 = 'C:/Users/xx/排序.xlsx'数据 = pd.read_excel(路径,header=None,names=['序号','品牌','人数','地区'],index_col='序号')# print(数据.sort_index())# print(数据.sort_values('品牌'))# print(数据.isnull()) 判断为空print(数据.notnull()) # 所有不为空的为true,空的falseimport pandas as pd路径 = 'C:/Users/xx/排序.xlsx'# 数据 = pd.read_excel(路径,header=None,names=['序号','品牌','人数','地区'],index_col='序号')数据 = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9]],columns=['a','b','c'])print(数据['a'][0]) #显示a列0行print(数据.loc[0]['a']) #loc根据行列进行查找 0行a类 columns的列名是 a b c 标签是名字print(数据.iloc[0][0]) #iloc根据行列的位置进行查询 位置查询print(数据[['a','b']]) # 查找指定类 a 列 b列import pandas as pd字典 = {'姓名':['松松','露露','乒乓'],'年龄':[20,30,50],'功夫':['健身','唱歌','跳舞']}数据 = pd.DataFrame(字典)print(数据)print(数据.dtypes) # 字段数据类型print(数据.columns) # 字段名print(数据.index) #索引print(数据['姓名']) # 查找姓名print(数据.loc[1]) #返回第一行数据print(数据.loc[1]['姓名']) #指定行和类 第一行的名字print(数据[['姓名','年龄']]) #返回两列数据print(数据.loc[0:3]) #返回多行loc 只要是行就是加loc或者iloc 前三行多个Series操作import pandas as pddata1 = pd.Series(['小王','小方','小黄'],index=[1,2,3],name='姓名')data2 = pd.Series(['男','男','男'],index=[1,2,3],name='性别')data3 = pd.Series([16,30,57],index=[1,2,4],name='年龄')# sheet = pd.DataFrame({data1.name:data1,data2:data2,data3:data3})sheet = pd.DataFrame([data1,data2,data3])print(sheet)
2.2 DataFrame 常用方法
import pandas as pdname = {'姓名':['小李','小方','小黄'],'性别':['男','女','男'],'身高':['160','180','175'],'体重':['160','180','175']}data = pd.DataFrame(name)print(data)# print(data.head(1)) 查找前几行# print(data.tail(1)) 查找后几行# print(data.values) 查找值# print(data.shape) 查找形状# print(data.fillna(0)) 空值填充为0# print(data.replace('小方','小红')) 替换把小方替换# print(data.isnull) 判读是否为空 空的地方为true# print(data.notnull) 判读是否不为空 不空的地方为true# print(data.dropna()) 删除空值# print(data.unique()) 查看唯一值# print(data.reset_index(drop=True)) 索引会直接删除# print(data.reset_index(drop=False))# print(data.merge()) 合并# print(data.concat())print(data.pivot_table) 用df座数据透视表
2.3 连接查询
innerMerge 内连接
leftMerge 左连接
rightMerge 右连接
outMerge 全连接
import pandas as pdimport numpy as npdata1 = pd.DataFrame({'姓名':['小里','小凡','小名','小成','小放'],'time1':np.arange(5)})data2 = pd.DataFrame({'姓名':['小红','小张','小力','小成'],'time2':[1,2,3,4]})print(data1)print('*'*30)print(data2)# data3 = pd.merge(data1,data2,on='姓名',how='inner') 内连接# data3 = pd.merge(data1,data2,on='姓名',how='left') 左连接相当于vlokkup 如果表没有显示为空# data3 = pd.merge(data1,data2,on='姓名',how='right')# data3 = pd.merge(data1,data2,on='姓名',how='outer') 全外连接 相当于两张表的联合# data3 = pd.merge(data1,data2,on=['姓名','']) 需要多个字段,可以加中括号print(data3)字段 姓名连接索引import pandas as pd
data1 = pd.DataFrame({'姓名':['小值','小方','小里','小成'],'time':range(4)})data2 = pd.DataFrame({'数据':[10,20]},index=['小值','小方'])data3 = pd.merge(data1,data2,left_on='姓名',right_index=True) 姓名连接索引 right_index=Trueprint(data3)suffixesimport pandas as pd
data1 = pd.DataFrame({'姓名':['小值','小方','小里','小成'],'time':range(4)})data2 = pd.DataFrame({'数据':[10,20]},index=['小值','小方'])# data3 = pd.merge(data1,data2,left_on='姓名',right_index=True) 姓名连接索引 right_index=Trueprint(data3)suffix后缀如果表中遇有一列两个表是相同的名,但是值不同,合并的时候都想要保存下来,就可以用suffixes来给每个表的重复列名增加后缀pd.merge(data1,data2,on='',suffixes=['',''])
2.4 Join 连接
import pandas as pdf = {'姓名1':['小值','小方','小凡','小李'],'年龄1':[15,35,53,23]}r = {'姓名2':['小空','小中','小各','小列'],'年龄2':[19,39,25,27]}l = pd.DataFrame(f)p = pd.DataFrame(r)print(l.join(p)) 连接是横向连接 不同索引列合并一个DataFrame join默认左外连接how=left结果姓名1 年龄1 姓名2 年龄2
0 小值 15 小空 19
1 小方 35 小中 39
2 小凡 53 小各 25
3 小李 23 小列 27
2.5 Concat
concat(objs,axis=0,join='outer',join_axes=None,ignore_index=Fales,keys=None,levels=None,names=None,verify_integrity=False)
属性 | 描述 |
objs | 合并的对象集合,可以是Series DataFrame |
axis | 合并方法,axis=0 表示纵向 1表示横向 |
join | 默认outer并集,inner交集 只有这两种 |
join_axes | 默认False 忽略,是否忽略原index |
keys | 为原始DataFrame添加一个键,默认无 |
ignore_index | 默认False忽略,是否忽略原index |
import pandas as pddata1 = pd.Series([0,1,2,3],index=['A','B','C','D'])data2 = pd.Series([4,5],index=['L','E'])# axis=1 连接data3 = pd.concat([data1,data2],axis=1)print(data3)
2.5.1 相同字段的收尾相连
frames =[df1,df2,df3]result = pd.conct(frams)要在相接的时候加上一个层次的Key来识别数据源来自那张表,可以增加Key参数result = pd.concat(Frames,keys=['x','y','z'])
2.5.2横向表连接(行对齐)
1 axis当axis=1时,concat就是行对齐,然后将不同的列名称的两张表合并result = pd.concat([df1,df4],axis=1)2 join加上join 属性如果inner 得到的是两张表的交集如果是outer 得到的是并集result = pd.concat([df1,df4],axis=1,join='inner')3 join_axes如果有join_axes 的参数传入,可以指定根据那个轴来对齐数据例如根据df1表对齐,就会保留指定df1的轴,然后将df4的表与之拼接result = pd.concat([df1,df4],axis=1,join_axex=[df1.index])
2.5.3 append
append 是Series和DataFrame 的方法,使用它就是默认连着列进行凭借axis=0 列对齐result = df1.append(df2)
2.5.4 无视index的concat
如果两个表的index都没有实际含义,使用ingor_index参数,置为true合并的连个表就根据列字段对齐,然后合并,最后再重新整理一个新的index
2.5.5 合并的同时增加区分数组的数据组
keys参数可以给合并后的表增加ke用区分不同表数据来源1 可以key参数实现result = pd.concat(frames,key=['x','y','z'])2 传入字典增加分组键pieces={'x':df1,'y':'df2','z':'df3'} x y z即为Key值result = pd.concat(pieces)
2.5.6 在dataframe中加入新的行
append 方法可以将series和字典就能够的数据作为dataframe的新一行插入s2 = pd.Series(['X0','X1','X2'],index=['A','B','C'])result = pd.append(s2,ingore_index=True)
2.5.7 表格字段不同的表进行合22
如果遇到两张表的列字段不同,但是想要合并,其中无效的值用nan来表示,可使用ingore_index实现dics = [{'A':1,'B':2,'C':3},{'A':4,'B':9,'C':5,'X':0}]result = df1.append(dics,ingore_index=True)汇总concat 可以沿着一条轴将多个对象连接在一起merge 可以根据一个或者多个键将不同的DataFrame中的行连接起来join inner交集 outer并集