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)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM