安裝 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)