pandas操作Excel
安装 pip3 install pandas
pip3 install openpyxl
创建数据表和文件
from PyQt5.QtWidgets import QApplication,QWidget import sys import pandas as pd class win(QWidget): def __init__(self): super().__init__() self.resize(500,500) self.setWindowTitle(\'Excel学习\') #df=pd.DataFrame() #创建数据表--空数据表 df = pd.DataFrame({\'姓名\':[\'张三\',\'李四\',\'王五\'],\'物理\':[56,98,45]}) # 创建数据表 df.to_excel(\'D:/ss/ss.xlsx\') #把数据表保存为xlsx文件 if __name__==\'__main__\': app=QApplication(sys.argv) w=win() w.show() sys.exit(app.exec_())
此时在指定目录中生成一个xlsx文件
打开后
第一列是pandas自动产生的索引列
自定义索引列
df = pd.DataFrame({\'ID\':[1,2,3],\'姓名\':[\'张三\',\'李四\',\'王五\'],\'物理\':[56,98,45]}) df=df.set_index(\'ID\') #设置索引列--这样不会单独产生索引列 df.to_excel(\'D:/ss/ss.xlsx\')
df.set_index(\'ID\',inplace=True) #设置索引列--这样不会单独产生索引列
读取文件
df = pd.read_excel(\'D:/ss/ss.xlsx\',header=0,index_col=\'ID\') #读取文件 #参数header 第几行是标题栏---有的文件第一行不是标题栏--0开始--默认0 #如果是空行能自动识别 #如果没有标题栏 header=None #参数index_col 指明索引列,这样pandas不会自动产生索引列
df = pd.read_excel(\'D:/ss/ss.xlsx\',header=3,usecols=\'C:H\',dtype={\'学号\':str,\'日期\':str,\'字符串\':str})
#skiprows=3 跳过最上边的n行
#usecols=\'C:H\' 读取C到H列
#dtype={\'学号\':str} 指定某列的数据类型,不能是int--float64不能转成int
df1 = pd.read_excel(\'D:/ss/ss.xlsx\',index_col=\'ID\',sheet_name=\'Sheet1\') #读取指定表格--默认第一张
【可以连续使用这条语句,但是后面的会覆盖掉前面的数据】
返回工作簿中的所有表格
import openpyxl
wb = openpyxl.load_workbook(\'D:\ss\ss.xlsx\') #打开工作簿
sheets = wb.sheetnames # 获取wb中所有的表格
#返回值:列表--[\'Sheet1\', \'Sheet2\']
print(sheets)
wb.close()
返回总行数和总列数
s=df.shape #返回总行数和总列数---(3, 3)
#不包括标题行
返回所有列标题
s=df.columns #返回所有列标题 #Index([\'ID\', \'姓名\', \'物理\'], dtype=\'object\')
返回头n行数据或末尾n行数据
s=df.head(4) #返回头n行数据---观察表格结构--默认5行 s = df.tail(4) #返回末尾n行数据
添加或修改标题
df.columns=[\'学号\',\'姓名\',\'数学\'] #添加或修改标题
创建序列
s1=pd.Series() #创建一个空序列 #序列的三个属性:data(现在不用了)、index、name d={\'x\':100,\'y\':200,\'z\':300} s1 = pd.Series(d) #创建一个序列---字典转化成序列 #把字典的keys转化为index,把values转化为data L1=[10,20,30] L2=[\'x\',\'y\',\'z\'] s1 = pd.Series(L1,index=L2) #把列表转化为序列 #注意:在pandas里行和列都是一个序列
把序列加到数据表
import pandas as pd s1 = pd.Series([1,2,3],index=[1,2,3],name=\'A\') #创建序列 #index相当于行号 name相当于列标 s2 = pd.Series([10, 20, 30], index=[1, 2, 3], name=\'B\') s3 = pd.Series([100, 200, 300], index=[1, 2, 3], name=\'C\') df=pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3}) #把序列以列形式加到数据表 print(df)
df=pd.DataFrame([s1,s2,s3]) #index做为列,name做为行
import pandas as pd s1 = pd.Series([1,2,3],index=[1,2,3],name=\'A\') s2 = pd.Series([10, 20, 30], index=[1, 2, 3], name=\'B\') s3 = pd.Series([100, 200, 300], index=[2, 3,4], name=\'C\') df=pd.DataFrame({s1.name:s1,s2.name:s2,s3.name:s3}) print(df) #index不同时取并集,空位子用NaN
返回指定列数据的序列(Series)
s=df[\'学号\'] #返回指定列数据的序列(Series)
给指定单元格赋值
df[\'学号\'].at[0]=1 #给指定单元格赋值
df.at[1,\'学号\']=2 #给指定单元格赋值
计算公式
df[\'总分\']=df[\'物理\']+df[\'数学\'] #总分列=物理列+数学列
import pandas as pd def add(x): return x+10 df = pd.read_excel(\'D:/ss/ss.xlsx\',index_col=\'ID\') df[\'总分\']=df[\'物理\'].apply(add) #把df[\'物理\']中的每个元素做为add参数进行计算
排序
df.sort_values(by=\'物理\',inplace=True,ascending=False) #排序--根据数据排序 #by=\'物理\'--排序的列 #inplace=True---在原数据表排序,不生成新数据表 #ascending=False 降序;ascending=True(默认) 升序
df.sort_values(by=[\'合格\',\'物理\'],inplace=True,ascending=[False,True]) #多重排序--根据数据排序
筛选
def saixuan(x):
s=60<=x<=100
return s
df=df.loc[df[\'物理\'].apply(saixuan)] #筛选
#参数为 True的行留下,false的行放弃
柱状图
import pandas as pd import matplotlib.pyplot as plt #2D制图库 #允许显示中文 plt.rcParams[\'font.sans-serif\']=[\'SimHei\'] #指定默认字体 SimHei为黑体 plt.rcParams[\'axes.unicode_minus\']=False #用来正常显示负号 df = pd.read_excel(\'D:/ss/ss.xlsx\',index_col=\'ID\') df.plot.bar(x=\'姓名\',y=\'数学\',color=\'r\',width=0.2,label="数学成绩",alpha=0.8,title=\'成绩对比图\') #柱状图 #参数1 x轴;参数2 y轴 #color 设置颜色 #width设置条形图的宽度 #alpha设置透明度 #label题注文本 #title图标题 plt.tight_layout() #紧凑型布局---横坐标的文本全部显示 plt.show()
合并数据表
import pandas as pd df1 = pd.read_excel(\'D:/ss/ss.xlsx\',index_col=\'ID\',sheet_name=\'Sheet1\') #读取指定表格--默认第一张 df2 = pd.read_excel(\'D:/ss/ss.xlsx\',index_col=\'ID\',sheet_name=\'Sheet2\') df3=df1.merge(df2,on=\'ID\',how=\'left\') #合并数据表 #df3=pd.merge(df1,df2,on=\'ID\') #把df1和df2两张表的数据进行合并 #on=\'ID\' 根据这列合并 两个表这个列必须有 #有相同名称的列,会自动改名,前面的加_x,后面的加_y #how=\'outer\' 两个表的数据都合并进来 #how=\'inner\' 只合并on=\'ID\'相同的数据----默认 #how=\'right\' 在\'inner\'的基础上右数据表全部合并进来 #how=\'left\' 在\'inner\'的基础上左数据表全部合并进来 df3=df3.fillna(0) #把NaN用改成0 # https://www.cnblogs.com/liming19680104/p/10468767.html df3.物理_y=df3.物理_y.astype(int) #数据类型转换 print(df3)
版权声明:本文为liming19680104原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。