小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

pandas如何操作Excel?還不會的,看此一篇足矣

 老三的休閑書屋 2021-04-01

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

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

pandas如何操作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 pds = pd.Series(['北山啦','關(guān)注','點贊'])s
0    北山啦1     關(guān)注2     點贊dtype: object
s = s.to_frame(name='列名')s
pandas如何操作Excel?還不會的,看此一篇足矣
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:指定作為列名的行,默認(rèn)為0,即第一行為列名。如果數(shù)據(jù)不含列名,則設(shè)為None
  • names:指定新的列名列表。列表中元素個數(shù)和列數(shù)必須一致
  • index_col:指定列為索引列,默認(rèn)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’: np.float64, 'b’: np.int32}
  • converters:用于轉(zhuǎn)換各列數(shù)據(jù)的函數(shù)的字典數(shù)據(jù),例如:{'a’: func_1, 'b’: func_2}
import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx')sheet.head()
pandas如何操作Excel?還不會的,看此一篇足矣

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

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

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

print(sheet['工資'])
0      76531      87992      98003     128804      36005      38006      89767     120008      89009      768810     671211     965512     685413     812214     678815     8830Name: 工資, dtype: int64

可以看到它的所有的數(shù)據(jù)都列出來了,并且這一列數(shù)據(jù)的數(shù)據(jù)類型是int64,即64位整型。
得到這一列數(shù)據(jù)后,我們可以對它進行處理。

for i in sheet['工資']: print(i)
765387999800128803600380089761200089007688671296556854812267888830

或者將它轉(zhuǎn)換成列表后再處理:

salaries = list(sheet['工資'])print(salaries)
[7653, 8799, 9800, 12880, 3600, 3800, 8976, 12000, 8900, 7688, 6712, 9655, 6854, 8122, 6788, 8830]

計算大家的平均工資:

sum = 0for i in salaries: sum += i print(f'總工資:{sum}')ave = sum / len(salaries)print(f'平均工資:{ave}')
總工資:131057平均工資:8191.0625

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

import functoolssum = 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 pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', usecols=[2])sheet
pandas如何操作Excel?還不會的,看此一篇足矣

或者:

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', usecols=['工資'])sheet
pandas如何操作Excel?還不會的,看此一篇足矣

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

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', names=['name','age','salary'])sheet
pandas如何操作Excel?還不會的,看此一篇足矣

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

import pandas as pddef formatsalary(num):    return f'¥{format(num,',')}'sheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', usecols=['工資'],converters={'工資':formatsalary})sheet
pandas如何操作Excel?還不會的,看此一篇足矣

上面通過converters指定了“工資”列,使用formatsalary函數(shù)來處理,所以取出來的數(shù)據(jù)就已經(jīng)處理過的了。當(dāng)然,我們也可以取出來后再對其進行格式化。

其他的參數(shù),大家可以自己進行試驗。下面我們再來看一下,假設(shè)我要取出所有大于等于8000的工資,該如何進行處理呢?我們可以使用按照條件來獲取DataFrame的行數(shù)據(jù):

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', usecols=['工資'])high_salary = sheet[sheet['工資'] >= 8000]high_salary
pandas如何操作Excel?還不會的,看此一篇足矣

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

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx')high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)]high_salary
pandas如何操作Excel?還不會的,看此一篇足矣

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

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx')high_salary = sheet[(sheet['工資'] >= 8000) & (sheet['工資'] <=10000)][['姓名','工資']]high_salary
pandas如何操作Excel?還不會的,看此一篇足矣

讀取多個數(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 pdsheet = pd.read_excel(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]
pandas如何操作Excel?還不會的,看此一篇足矣

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

import pandas as pdsheet = pd.read_excel(io='測試數(shù)據(jù).xlsx', sheet_name=[1, 0])st = pd.concat(sheet,ignore_index = True)st
pandas如何操作Excel?還不會的,看此一篇足矣

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

合并多個工作表

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

# -*- coding:utf-8 -*-# @Address:https://beishan.blog.csdn.net/# @Author:北山啦import pandas as pdimport ospath = r'E:\Python\00數(shù)據(jù)分析\RichardFu123\五省PM2.5\archive'dfs,index = [],0for i in os.listdir(path):    dfs.append(pd.read_csv(os.path.join(path,i)))    print(f'正在合并{index+1}工作表')    index += 1df = 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:寫入的工作表名稱,是一個字符串,默認(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 pddf = pd.DataFrame({'姓名':['李雷', '韓梅梅', '小明', '張三', '李四', '王五'], '年齡':[31, 22, 30, 49, 38, 33]})df.to_excel('員工表.xlsx', sheet_name='202002入職')

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

f = pd.read_excel('員工表.xlsx')f
pandas如何操作Excel?還不會的,看此一篇足矣

可以看到,確實已經(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 李雷 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}

但是仔細看的話,會發(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   李雷  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_workbookbook = 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加入原來的兩個workbook df3.to_excel(writer, sheet_name='候補員工', index=False, columns=['Names', 'Age']) writer.save()
import pandas as pdsheet = pd.read_excel(io='Employees.xlsx', 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_workbookbook = 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個workbook    writer.sheets = {ws.title: ws for ws in book.worksheets}    start_row = writer.sheets['候補員工'].max_row    df4.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,還有就是為了避免重復(fù)的表頭,將header設(shè)置成False。

import pandas as pdsheet = pd.read_excel(io='Employees.xlsx', 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}
pandas如何操作Excel?還不會的,看此一篇足矣

作者:北山啦

原文鏈接:
https://beishan.blog.csdn.net/article/details/115290941

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多