Excel任務(wù)摘要,包括python任務(wù)系列和數(shù)據(jù)幀互切、使用pandas讀取Excel表、讀取python多個數(shù)據(jù)表、合并python多個工作表和寫入Excel文件。
Pandas是基于NumPy的數(shù)據(jù)分析工具。提供了多種快速處理數(shù)據(jù)的方法。
通用數(shù)據(jù)類型
Series:類似于NumPy的一維數(shù)組的一維數(shù)組,python本身的list也類似。與Series中的數(shù)據(jù)不同的數(shù)據(jù)可以是一個數(shù)據(jù),但list中的數(shù)據(jù)可以不同。Time-Series:基于時間的SeriesDataFrame:基于2d表的數(shù)據(jù)結(jié)構(gòu)。常用于處理Excel表數(shù)據(jù)等。本課重點介紹三維陣列(版本0.25后一致使用xarray,不再支持Panel)系列和數(shù)據(jù)幀的相互切換。
使用To_frame()從Series實施到DataFrame使用squeeze()從單列數(shù)據(jù)DataFrame實施到Seriesimport pandas as PD
s=([‘北山’,‘關(guān)心’,‘點贊’])
是S0北山
1興趣
兩點好
dtype : objects=s . to _ frame(name='列名')
S
S.squeeze()0北山
1興趣
兩點好
Name:列名,dtype:對象使用pandas讀取Excel表
在Pandas中,Excel讀取非常簡單。只有一個名為readExcel()的方法,但參數(shù)非常多
主要共同參數(shù)如下:
Io:通常,您可以指定excel文件路徑。Excelfile、xlrd。也可以是其他excel讀取對象,例如Book。sheet_name:指定工作表(工作表)的名稱。數(shù)字(工作表以零開頭的索引)可以是header:指定要用作列名的行。默認(rèn)值為0(第一行列名)。如果數(shù)據(jù)沒有列名,請設(shè)置為Nonenames:指定新的列名列表。列表中的元素數(shù)和列數(shù)必須匹配。index_col:指定列作為索引列,默認(rèn)None為索引0的第一列為索引列usecols:要解析數(shù)據(jù)的列可以是int或str列表,也可以是逗號分隔的字符串(pandas 0.24的新功能)?!癴”表示列a、c和f 3?!癮、c、f、k : q”dtype:每列的數(shù)據(jù)類型。例如,{'a' :np.float 64,)
Sheet=(io='測試數(shù)據(jù)。xlsx ')
()
首先,讓我們看一下檢索到的數(shù)據(jù)的數(shù)據(jù)類型。
“印刷(類型(圖紙)類”;你看,這就是我們前面提到的數(shù)據(jù)幀數(shù)據(jù)??梢酝ㄟ^列名直接獲取。例如,要獲取所有薪金信息,您可以執(zhí)行以下操作:
Print(圖紙['工資'])0 7653
1 8799
2 9800
3 12880
4 3600
5 3800
6 89
76 7 12000 8 8900 9 7688 10 6712 11 9655 12 6854 13 8122 14 6788 15 8830 Name: 工資, dtype: int64可以看到它的所有的數(shù)據(jù)都列出來了,并且這一列數(shù)據(jù)的數(shù)據(jù)類型是int64,即64位整型。
得到這一列數(shù)據(jù)后,我們可以對它進行處理。
for i in sheet['工資']: print(i)
7653 8799 9800 12880 3600 3800 8976 12000 8900 7688 6712 9655 6854 8122 6788 8830
或者將它轉(zhuǎn)換成列表后再處理:
salaries = list(sheet['工資']) print(salaries)
[7653, 8799, 9800, 12880, 3600, 3800, 8976, 12000, 8900, 7688, 6712, 9655, 6854, 8122, 6788, 8830]
計算大家的平均工資:
sum = 0 for i in salaries: sum += i print(f"總工資:{sum}") ave = sum / len(salaries) print(f"平均工資:{ave}")
總工資:131057 平均工資:8191.0625
我們也可以對求和的方法,使用lambda表達(dá)式(匿名函數(shù))結(jié)合reduce()函數(shù)進行。reduce()函數(shù)會對列表、元組等可遍歷的元素依次進行運算:將第一個元素和第二個元素進行運算,并將結(jié)果和第三個元素進行運算,直到最后一個元素。
import functools sum = (lambda x, y: x + y, salaries) print(sum)
131057
我們可以使用read_excel中的usecols參數(shù),通過它指定我們需要讀取數(shù)據(jù)的列,它接收字符串或者整數(shù)列表格式的數(shù)據(jù),列表中列出我們想要取出數(shù)據(jù)的列的名稱或者索引。
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", usecols=[2]) sheet
或者:
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", usecols=['工資']) sheet
如果想在讀取數(shù)據(jù)的時候,將原來的列的名字改成其他名字,則可以使用names參數(shù)指定為其他列名:
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", names=['name','age','salary']) sheet
需要注意的是,此時,我們?nèi)绻獙@個DataFrame進行操作,就需要使用新的列名了。 如果我們想在取出工資數(shù)據(jù)的時候,以“¥12,345”的格式顯示,則可以在獲取數(shù)據(jù)的時候,就指定轉(zhuǎn)換函數(shù):
import pandas as pd def formatsalary(num): return f"¥{format(num,',')}" sheet = (io="測試數(shù)據(jù).xlsx", usecols=['工資'],converters={'工資':formatsalary}) sheet
上面通過converters指定了“工資”列,使用formatsalary函數(shù)來處理,所以取出來的數(shù)據(jù)就已經(jīng)處理過的了。當(dāng)然,我們也可以取出來后再對其進行格式化。
其他的參數(shù),大家可以自己進行試驗。下面我們再來看一下,假設(shè)我要取出所有大于等于8000的工資,該如何進行處理呢?我們可以使用按照條件來獲取DataFrame的行數(shù)據(jù):
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", usecols=['工資']) high_salary = sheet[sheet['工資'] >= 8000] high_salary
如果想取得工資大于等于8000小于等于10000的數(shù)據(jù):
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx") high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)] high_salary
如果只想顯示符合條件的姓名和工資,則可以通過列表的方式指定要顯示的列:
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx") high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)][['姓名','工資']] high_salary
讀取多個數(shù)據(jù)表
在上面的例子中,雖然在“測試數(shù)據(jù).xlsx”文件中包含了兩個數(shù)據(jù)表(sheet),但它只讀取了第一個數(shù)據(jù)表的內(nèi)容,如果我想把兩個數(shù)據(jù)表數(shù)據(jù)都讀取出來該怎么辦呢?可以指定sheet_name參數(shù),它接收字符串、數(shù)字、字符串或數(shù)字列表以及None。如果指定為None,則返回所有數(shù)據(jù)表數(shù)據(jù)。默認(rèn)為0,即返回第一個數(shù)據(jù)表數(shù)據(jù)。
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", sheet_name=[0, 1]) sheet
{0: 姓名 年齡 工資 0 OLIVER. 23 7653 1 HARRY. 45 8799 2 GEORGE. 34 9800 3 NOAH. 54 12880 4 JACK. 34 3600 5 JACOB. 32 3800 6 MUHAMMAD. 51 8976 7 LEO. 46 12000 8 Harper. 42 8900 9 Evelyn. 38 7688 10 Ella. 33 6712 11 Avery. 26 9655 12 Scarlett. 37 6854 13 Madison. 41 8122 14 Lily. 54 6788 15 Eleanor. 28 8830, 1: 姓名 年齡 工資 0 張三 39 15000 1 李四 43 16000 2 李雷 25 6800 3 韓梅梅 28 23000}
可以看到,得到了兩個數(shù)據(jù)表的數(shù)據(jù)。此時要得到數(shù)據(jù)表中的數(shù)據(jù),就需要先通過sheet[0]、sheet[1]得到第一個數(shù)據(jù)表的所有數(shù)據(jù),再在這個數(shù)據(jù)表數(shù)據(jù)中對數(shù)據(jù)進行處理了,例如:
sheet[1]
如果用的是數(shù)據(jù)表的名字,則應(yīng)該寫成sheet[‘甲公司’]。
如果我們想把這兩個數(shù)據(jù)表的數(shù)據(jù)合并到一起,可以使用pandas中的concat()函數(shù):
import pandas as pd sheet = (io="測試數(shù)據(jù).xlsx", sheet_name=[1, 0]) st = (sheet,ignore_index = True) st
這里ignore_index的意思是忽略各自的索引,統(tǒng)一使用新的索引。
合并多個工作表
多個EXCECL合并到一個工作表中,Python來幫你實現(xiàn)
# -*- coding:utf-8 -*- # @Addre # @Author:北山啦 import pandas as pd import os path = r"E:\Python\00數(shù)據(jù)分析\RichardFu123\五省PM2.5\archive" dfs,index = [],0 for i in os.listdir(path): d(path,i))) print(f"正在合并{index+1}工作表") index += 1 df = (dfs) df.to_csv("數(shù)據(jù)匯總.csv",index=False)
正在合并1工作表 正在合并2工作表 正在合并3工作表 正在合并4工作表 正在合并5工作表 正在合并6工作表 正在合并7工作表
寫入Excel文件
可以將DataFrame數(shù)據(jù)寫入到一個新的Excel文件中,例如,我們可以將上面合并的兩個Excel數(shù)據(jù)表數(shù)據(jù),寫入到新的Excel文件中:
df = (st) df.to_excel("合并工資報表.xlsx")
這里我們使用DataFrame上的to_excel()方法將數(shù)據(jù)寫入到Excel文件中。它的原型是:to_excel(self, excel_writer, sheet_name=‘Sheet1’, na_rep=’’, float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep=‘inf’, verbose=True, freeze_panes=None),常用的參數(shù)說明:
- excel_writer:需要指定一個寫入的文件,可以是字符串或者ExcelWriter對象
- sheet_name:寫入的工作表名稱,是一個字符串,默認(rèn)為’Sheet1’
- na_rep:當(dāng)沒有數(shù)據(jù)的時候,應(yīng)該填入的默認(rèn)值,默認(rèn)為空字符串
- float_format:浮點數(shù)格式,默認(rèn)為None??梢园凑說loat_format="%.2f"這樣的方式指定
- columns:指定寫入的列名順序,是一個列表。
- header:是否有表頭,默認(rèn)為True,可以是布爾類型或者字符串列表。
- index:是否加上行索引,默認(rèn)為True。
- index_label:索引標(biāo)簽,可以是字符串或者列表,默認(rèn)為None。
- startrow:插入數(shù)據(jù)的起始行,默認(rèn)為0。
- startcol:插入數(shù)據(jù)的其實列,默認(rèn)0
- engine:使用的寫文件引擎,例如:‘openpyxl’ 、 ‘xlsxwriter’
- 當(dāng)然,我們也可以不限于將一個Excel表中的數(shù)據(jù)寫入到另一個Excel文件,我們自己在程序中運行得到的數(shù)據(jù),也可以將其組織成DataFrame后,寫入到Excel文件中。
import pandas as pd df = ({'姓名':['李雷', '韓梅梅', '小明', '張三', '李四', '王五'], '年齡':[31, 22, 30, 49, 38, 33]}) df.to_excel("員工表.xlsx", sheet_name="202002入職")
看看是不是寫入到文件了:
f = ("員工表.xlsx") f
可以看到,確實已經(jīng)寫入進去了。
那如果要寫多個數(shù)據(jù)到一個Excel文件的多個數(shù)據(jù)表(sheet)中,該怎么處理呢?此時可以使用下面的方法。
df1 = ({'姓名':['李雷', '韓梅梅', '小明', '張三', '李四', '王五'], '年齡':[31, 22, 30, 49, 38, 33]}) df2 = ({'Names': ['Andrew', 'Tomas', 'Larry', 'Sophie', 'Sally', 'Simone'], 'Age':[42, 37, 39, 35, 29, 27]}) dfs = {'國內(nèi)員工':df1, '外籍員工':df2} writer = ('Em;, engine='xlsxwriter') for sheet_name in d(): dfs[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False) wri()
看看是不是已經(jīng)寫入到文件了:
sheet = (io="Em;, sheet_name=None) sheet
{'國內(nèi)員工': 姓名 年齡 0 李雷 31 1 韓梅梅 22 2 小明 30 3 張三 49 4 李四 38 5 王五 33, '外籍員工': Names Age 0 Andrew 42 1 Tomas 37 2 Larry 39 3 Sophie 35 4 Sally 29 5 Simone 27}
但是仔細(xì)看的話,會發(fā)現(xiàn)上面的外籍員工這個數(shù)據(jù)表,字段Names和Age反了,這是因為DataFrame自動按照字母順序給我們排序了。要避免這種情況,需要在to_excel()中加上columns來指定表頭字段順序:
df1 = ({'姓名':['李雷', '韓梅梅', '小明', '張三', '李四', '王五'], '年齡':[31, 22, 30, 49, 38, 33]}) df2 = ({'Names': ['Andrew', 'Tomas', 'Larry', 'Sophie', 'Sally', 'Simone'], 'Age':[42, 37, 39, 35, 29, 27]}) dfs = {'國內(nèi)員工':df1, '外籍員工':df2} cols = {"國內(nèi)員工":['姓名', '年齡'],"外籍員工":['Names','Age']} # 指定列名順序 writer = ('Em;, engine='xlsxwriter') for sheet_name in d(): dfs[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False, columns = cols[sheet_name]) wri()
再來看看現(xiàn)在是否正確:
sheet = (io="Em;, sheet_name=None) sheet
{'國內(nèi)員工': 姓名 年齡 0 李雷 31 1 韓梅梅 22 2 小明 30 3 張三 49 4 李四 38 5 王五 33, '外籍員工': Names Age 0 Andrew 42 1 Tomas 37 2 Larry 39 3 Sophie 35 4 Sally 29 5 Simone 27}
現(xiàn)在沒問題了。
還可以使用前面讀寫文件的時候的with … 這種方式。
上面的方式,會覆蓋原來的文件內(nèi)容。如果要在原有的Excel表中加上一個新的數(shù)據(jù)表(sheet),可以通過下面的方式:
from openpyxl import load_workbook book = load_workbook("Em;) # 加載原有的數(shù)據(jù)到Workbook df3 = ({'Names': ['Judy'], 'Age':[27]}) with ('Em;, engine='openpyxl') as writer: wri = book # 讓writer加入原來的兩個workbook d(writer, sheet_name='候補員工', index=False, columns=['Names', 'Age']) wri()
import pandas as pd sheet = (io="Em;, sheet_name=None) sheet
{'國內(nèi)員工': 姓名 年齡 0 李雷 31 1 韓梅梅 22 2 小明 30 3 張三 49 4 李四 38 5 王五 33, '外籍員工': Names Age 0 Andrew 42 1 Tomas 37 2 Larry 39 3 Sophie 35 4 Sally 29 5 Simone 27, '候補員工': Names Age 0 Judy 27}
可以看到,在原來的Excel文件中,已經(jīng)加入了“候補員工”這個數(shù)據(jù)表。加入需要在某個數(shù)據(jù)表中加入數(shù)據(jù)(append),可以使用下面方式:
from openpyxl import load_workbook book = load_workbook("Em;) # 加載原有的數(shù)據(jù)到Workbook df4 = ({'Names': ['Moore'], 'Age':[38]}) with ('Em;, engine='openpyxl') as writer: wri = book # 讓writer加入原來的3個workbook wri = {ws.title: ws for ws in book.worksheets} start_row = wri['候補員工'].max_row d(writer, sheet_name='候補員工', index=False, columns=['Names', 'Age'], startrow=start_row,header=False) wri()
這里的要點是:使用startrow指定要插入數(shù)據(jù)的文字,這里還要注意我們是往某個已經(jīng)存在的數(shù)據(jù)表插入數(shù)據(jù),所以要指定正確的sheet_name,還有就是為了避免重復(fù)的表頭,將header設(shè)置成False。
import pandas as pd sheet = (io="Em;, sheet_name=None) sheet
{'國內(nèi)員工': 姓名 年齡 0 李雷 31 1 韓梅梅 22 2 小明 30 3 張三 49 4 李四 38 5 王五 33, '外籍員工': Names Age 0 Andrew 42 1 Tomas 37 2 Larry 39 3 Sophie 35 4 Sally 29 5 Simone 27, '候補員工': Names Age 0 Judy 27 1 Moore 38}
作者:北山啦
原文鏈接:
1.《【label怎么連接excel】Pandas如何操作Excel?還不行,看這篇報道就夠了》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。
2.《【label怎么連接excel】Pandas如何操作Excel?還不行,看這篇報道就夠了》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/2520044.html