日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pandas 玩转 Excel 操作总结

發(fā)布時間:2023/12/8 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pandas 玩转 Excel 操作总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Python 操作Excel操作總結(jié),包括Series和Data Frame的互轉(zhuǎn)、使用pandas讀取Excel表格、python讀取多個數(shù)據(jù)表、python合并多個工作表以及寫入Excel文件

pandas是一款基于NumPy的數(shù)據(jù)分析工具。它提供了大量的能使我們快捷處理數(shù)據(jù)的方法。

數(shù)據(jù)科學線性代數(shù)公式匯總

隨筆記錄所的所學,此博客為我記錄文章所用,發(fā)布到此,僅供網(wǎng)友閱讀參考。作者:北山啦

# -*- coding:utf-8 -*- # @Address:https://beishan.blog.csdn.net/ # @Author:北山啦

文章目錄

  • Series和Data Frame的互轉(zhuǎn)
  • 使用pandas讀取Excel表格
  • 讀取多個數(shù)據(jù)表
  • 合并多個工作表
  • 寫入Excel文件

常用數(shù)據(jù)類型

  • Series:一維數(shù)組,與NumPy中的一維數(shù)組相似,和Python自身的list也相似。區(qū)別自語Series中的數(shù)據(jù)只能是一種數(shù)據(jù),而list中的數(shù)據(jù)可以不一樣
  • Time-Series:以時間為索引的Series
  • DataFrame:二維的表格型數(shù)據(jù)結(jié)構(gòu)。經(jīng)常用于處理Excel表格數(shù)據(jù)等,這也是我們本節(jié)課會重點講的內(nèi)容
  • Panel:三維數(shù)組(0.25版本后,統(tǒng)一使用xarray,不再支持Panel)

Series和Data Frame的互轉(zhuǎn)

  • 利用to_frame()實現(xiàn)Series轉(zhuǎn)DataFrame
  • 利用squeeze()實現(xiàn)單列數(shù)據(jù)DataFrame轉(zhuǎn)Series
import pandas as pd s = pd.Series(["北山啦","關(guān)注","點贊"]) s 0 北山啦 1 關(guān)注 2 點贊 dtype: object s = s.to_frame(name="列名") s 列名012
北山啦
關(guān)注
點贊
s.squeeze() 0 北山啦 1 關(guān)注 2 點贊 Name: 列名, dtype: object

使用pandas讀取Excel表格

在pandas中,讀取Excel非常簡單,它只有一個方法:readExcel(),但是的參數(shù)非常多

主要常用的參數(shù),我們先對其進行了解:

  • io:一般指定excel文件路徑就可以了。也可以是其他Excel讀取對象如ExcelFile、xlrd.Book等
  • sheet_name:用于指定工作表(sheet)名稱。可以是數(shù)字(工作表從0開始的索引)
  • header:指定作為列名的行,默認為0,即第一行為列名。如果數(shù)據(jù)不含列名,則設(shè)為None
  • names:指定新的列名列表。列表中元素個數(shù)和列數(shù)必須一致
  • index_col:指定列為索引列,默認None指的是索引為0的第一列為索引列
  • usecols:要解析數(shù)據(jù)的列,可以是int或者str的列表,也可以是以逗號分隔的字符串(pandas 0.24新增功能),例如:”A:F”,表示從A列到F列,”A,C,F”表示A、C、F三列,還可以寫成”A,C,F,K:Q”
  • dtype:各列的數(shù)據(jù)類型,例如:{‘a(chǎn)’: np.float64, ‘b’: np.int32}
  • converters:用于轉(zhuǎn)換各列數(shù)據(jù)的函數(shù)的字典數(shù)據(jù),例如:{‘a(chǎn)’: func_1, ‘b’: func_2}
import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx") sheet.head() 姓名年齡工資01234
OLIVER.237653
HARRY.458799
GEORGE.349800
NOAH.5412880
JACK.343600

我們先來看一下取回的數(shù)據(jù)的數(shù)據(jù)類型是什么。

print(type(sheet)) <class 'pandas.core.frame.DataFrame'>

可以看到,它就是我們前面提到的DataFrame數(shù)據(jù)。,直接通過它的列名稱來獲取即可,比如,要獲得所有的工資信息,可以如下:

print(sheet['工資']) 0 7653 1 8799 2 9800 3 12880 4 3600 5 3800 6 8976 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 += iprint(f"總工資:{sum}") ave = sum / len(salaries) print(f"平均工資:{ave}") 總工資:131057 平均工資:8191.0625

我們也可以對求和的方法,使用lambda表達式(匿名函數(shù))結(jié)合reduce()函數(shù)進行。reduce()函數(shù)會對列表、元組等可遍歷的元素依次進行運算:將第一個元素和第二個元素進行運算,并將結(jié)果和第三個元素進行運算,直到最后一個元素。

import functools sum = functools.reduce(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 = pd.read_excel(io="測試數(shù)據(jù).xlsx", usecols=[2]) sheet 工資0123456789101112131415
7653
8799
9800
12880
3600
3800
8976
12000
8900
7688
6712
9655
6854
8122
6788
8830

或者:

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", usecols=['工資']) sheet 工資0123456789101112131415
7653
8799
9800
12880
3600
3800
8976
12000
8900
7688
6712
9655
6854
8122
6788
8830

如果想在讀取數(shù)據(jù)的時候,將原來的列的名字改成其他名字,則可以使用names參數(shù)指定為其他列名:

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", names=['name','age','salary']) sheet nameagesalary0123456789101112131415
OLIVER.237653
HARRY.458799
GEORGE.349800
NOAH.5412880
JACK.343600
JACOB.323800
MUHAMMAD.518976
LEO.4612000
Harper.428900
Evelyn.387688
Ella.336712
Avery.269655
Scarlett.376854
Madison.418122
Lily.546788
Eleanor.288830

需要注意的是,此時,我們?nèi)绻獙@個DataFrame進行操作,就需要使用新的列名了。 如果我們想在取出工資數(shù)據(jù)的時候,以“¥12,345”的格式顯示,則可以在獲取數(shù)據(jù)的時候,就指定轉(zhuǎn)換函數(shù):

import pandas as pd def formatsalary(num):return f"¥{format(num,',')}"sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", usecols=['工資'],converters={'工資':formatsalary}) sheet

工資0123456789101112131415
¥7,653
¥8,799
¥9,800
¥12,880
¥3,600
¥3,800
¥8,976
¥12,000
¥8,900
¥7,688
¥6,712
¥9,655
¥6,854
¥8,122
¥6,788
¥8,830

上面通過converters指定了“工資”列,使用formatsalary函數(shù)來處理,所以取出來的數(shù)據(jù)就已經(jīng)處理過的了。當然,我們也可以取出來后在對其進行格式化。
其他的參數(shù),大家可以自己進行試驗。下面我們再來看一下,假設(shè)我要取出所有大于等于8000的工資,該如何進行處理呢?我們可以使用按照條件來獲取DataFrame的行數(shù)據(jù):

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", usecols=['工資']) high_salary = sheet[sheet['工資'] >= 8000] high_salary 工資123678111315
8799
9800
12880
8976
12000
8900
9655
8122
8830

如果想取得工資大于等于8000小于等于10000的數(shù)據(jù):

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx") high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)] high_salary 姓名年齡工資1268111315
HARRY.458799
GEORGE.349800
MUHAMMAD.518976
Harper.428900
Avery.269655
Madison.418122
Eleanor.288830

如果只想顯示符合條件的姓名和工資,則可以通過列表的方式指定要顯示的列:

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx") high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)][['姓名','工資']] high_salary 姓名工資1268111315
HARRY.8799
GEORGE.9800
MUHAMMAD.8976
Harper.8900
Avery.9655
Madison.8122
Eleanor.8830

讀取多個數(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ù)。默認為0,即返回第一個數(shù)據(jù)表數(shù)據(jù)。

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", sheet_name=[0, 1]) sheet {0: 姓名 年齡 工資0 OLIVER. 23 76531 HARRY. 45 87992 GEORGE. 34 98003 NOAH. 54 128804 JACK. 34 36005 JACOB. 32 38006 MUHAMMAD. 51 89767 LEO. 46 120008 Harper. 42 89009 Evelyn. 38 768810 Ella. 33 671211 Avery. 26 965512 Scarlett. 37 685413 Madison. 41 812214 Lily. 54 678815 Eleanor. 28 8830,1: 姓名 年齡 工資0 張三 39 150001 李四 43 160002 李雷 25 68003 韓梅梅 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] 姓名年齡工資0123
張三3915000
李四4316000
李雷256800
韓梅梅2823000

如果用的是數(shù)據(jù)表的名字,則應該寫成sheet[‘甲公司’]。
如果我們想把這兩個數(shù)據(jù)表的數(shù)據(jù)合并到一起,可以使用pandas中的concat()函數(shù):

import pandas as pd sheet = pd.read_excel(io="測試數(shù)據(jù).xlsx", sheet_name=[1, 0]) st = pd.concat(sheet,ignore_index = True) st 姓名年齡工資012345678910111213141516171819
張三3915000
李四4316000
李雷256800
韓梅梅2823000
OLIVER.237653
HARRY.458799
GEORGE.349800
NOAH.5412880
JACK.343600
JACOB.323800
MUHAMMAD.518976
LEO.4612000
Harper.428900
Evelyn.387688
Ella.336712
Avery.269655
Scarlett.376854
Madison.418122
Lily.546788
Eleanor.288830

這里ignore_index的意思是忽略各自的索引,統(tǒng)一使用新的索引。

合并多個工作表

多個EXCECL合并到一個工作表中,Python來幫你實現(xiàn)

# -*- coding:utf-8 -*- # @Address:https://beishan.blog.csdn.net/ # @Author:北山啦 import pandas as pd import os path = r"五省PM2.5\archive" dfs,index = [],0 for i in os.listdir(path):dfs.append(pd.read_csv(os.path.join(path,i)))print(f"正在合并{index+1}工作表")index += 1 df = pd.concat(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 = pd.DataFrame(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:寫入的工作表名稱,是一個字符串,默認為’Sheet1’
  • na_rep:當沒有數(shù)據(jù)的時候,應該填入的默認值,默認為空字符串
  • float_format:浮點數(shù)格式,默認為None。可以按照float_format="%.2f"這樣的方式指定
  • columns:指定寫入的列名順序,是一個列表。
  • header:是否有表頭,默認為True,可以是布爾類型或者字符串列表。
  • index:是否加上行索引,默認為True。
  • index_label:索引標簽,可以是字符串或者列表,默認為None。
  • startrow:插入數(shù)據(jù)的起始行,默認為0。
  • startcol:插入數(shù)據(jù)的其實列,默認0
  • engine:使用的寫文件引擎,例如:‘openpyxl’ 、 ‘xlsxwriter’
    當然,我們也可以不限于將一個Excel表中的數(shù)據(jù)寫入到另一個Excel文件,我們自己在程序中運行得到的數(shù)據(jù),也可以將其組織成DataFrame后,寫入到Excel文件中。
import pandas as pd df = pd.DataFrame({'姓名':['李雷', '韓梅梅', '小明','張三', '李四', '王五'],'年齡':[31, 22, 30, 49, 38, 33]}) df.to_excel("員工表.xlsx", sheet_name="202002入職")

看看是不是寫入到文件了:

f = pd.read_excel("員工表.xlsx") f Unnamed: 0姓名年齡012345
0李雷31
1韓梅梅22
2小明30
3張三49
4李四38
5王五33

可以看到,確實已經(jīng)寫入進去了。
那如果要寫多個數(shù)據(jù)到一個Excel文件的多個數(shù)據(jù)表(sheet)中,該怎么處理呢?此時可以使用下面的方法。

df1 = pd.DataFrame({'姓名':['李雷', '韓梅梅', '小明','張三', '李四', '王五'],'年齡':[31, 22, 30, 49, 38, 33]})df2 = pd.DataFrame({'Names': ['Andrew', 'Tomas', 'Larry','Sophie', 'Sally', 'Simone'],'Age':[42, 37, 39, 35, 29, 27]})dfs = {'國內(nèi)員工':df1, '外籍員工':df2} writer = pd.ExcelWriter('Employees.xlsx', engine='xlsxwriter')for sheet_name in dfs.keys():dfs[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)writer.save()

看看是不是已經(jīng)寫入到文件了:

sheet = pd.read_excel(io="Employees.xlsx", sheet_name=None) sheet {'國內(nèi)員工': 姓名 年齡0 李雷 311 韓梅梅 222 小明 303 張三 494 李四 385 王五 33,'外籍員工': Names Age0 Andrew 421 Tomas 372 Larry 393 Sophie 354 Sally 295 Simone 27}

但是仔細看的話,會發(fā)現(xiàn)上面的外籍員工這個數(shù)據(jù)表,字段Names和Age反了,這是因為DataFrame自動按照字母順序給我們排序了。要避免這種情況,需要在to_excel()中加上columns來指定表頭字段順序:

df1 = pd.DataFrame({'姓名':['李雷', '韓梅梅', '小明','張三', '李四', '王五'],'年齡':[31, 22, 30, 49, 38, 33]})df2 = pd.DataFrame({'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 = pd.ExcelWriter('Employees.xlsx', engine='xlsxwriter')for sheet_name in dfs.keys():dfs[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False, columns = cols[sheet_name])writer.save()

再來看看現(xiàn)在是否正確:

sheet = pd.read_excel(io="Employees.xlsx", sheet_name=None) sheet {'國內(nèi)員工': 姓名 年齡0 李雷 311 韓梅梅 222 小明 303 張三 494 李四 385 王五 33,'外籍員工': Names Age0 Andrew 421 Tomas 372 Larry 393 Sophie 354 Sally 295 Simone 27}

現(xiàn)在沒問題了。
還可以使用前面讀寫文件的時候的with … 這種方式。
上面的方式,會覆蓋原來的文件內(nèi)容。如果要在原有的Excel表中加上一個新的數(shù)據(jù)表(sheet),可以通過下面的方式:

from openpyxl import load_workbook book = load_workbook("Employees.xlsx") # 加載原有的數(shù)據(jù)到Workbookdf3 = pd.DataFrame({'Names': ['Judy'],'Age':[27]})with pd.ExcelWriter('Employees.xlsx',engine='openpyxl') as writer: writer.book = book # 讓writer加入原來的兩個workbookdf3.to_excel(writer, sheet_name='候補員工', index=False, columns=['Names', 'Age'])writer.save() import pandas as pd sheet = pd.read_excel(io="Employees.xlsx", sheet_name=None) sheet {'國內(nèi)員工': 姓名 年齡0 李雷 311 韓梅梅 222 小明 303 張三 494 李四 385 王五 33,'外籍員工': Names Age0 Andrew 421 Tomas 372 Larry 393 Sophie 354 Sally 295 Simone 27,'候補員工': Names Age0 Judy 27}

可以看到,在原來的Excel文件中,已經(jīng)加入了“候補員工”這個數(shù)據(jù)表。加入需要在某個數(shù)據(jù)表中加入數(shù)據(jù)(append),可以使用下面方式:

from openpyxl import load_workbook book = load_workbook("Employees.xlsx") # 加載原有的數(shù)據(jù)到Workbookdf4 = pd.DataFrame({'Names': ['Moore'],'Age':[38]})with pd.ExcelWriter('Employees.xlsx',engine='openpyxl') as writer: writer.book = book # 讓writer加入原來的3個workbookwriter.sheets = {ws.title: ws for ws in book.worksheets}start_row = writer.sheets['候補員工'].max_rowdf4.to_excel(writer, sheet_name='候補員工', index=False, columns=['Names', 'Age'], startrow=start_row,header=False)writer.save()

這里的要點是:使用startrow指定要插入數(shù)據(jù)的文字,這里還要注意我們是往某個已經(jīng)存在的數(shù)據(jù)表插入數(shù)據(jù),所以要指定正確的sheet_name,還有就是為了避免重復的表頭,將header設(shè)置成False。

import pandas as pd sheet = pd.read_excel(io="Employees.xlsx", sheet_name=None) sheet {'國內(nèi)員工': 姓名 年齡0 李雷 311 韓梅梅 222 小明 303 張三 494 李四 385 王五 33,'外籍員工': Names Age0 Andrew 421 Tomas 372 Larry 393 Sophie 354 Sally 295 Simone 27,'候補員工': Names Age0 Judy 271 Moore 38}

到這里就結(jié)束了,如果對你有幫助,歡迎點贊關(guān)注評論,你的點贊對我很重要。

總結(jié)

以上是生活随笔為你收集整理的pandas 玩转 Excel 操作总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。