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)

 

 

posted @ 2019-08-04 16:59  天子骄龙  阅读(2275)  评论(0编辑  收藏  举报