分享2个Python处理Excel的脚本
一、寫在前面
來源于兩個讀者的學(xué)習(xí)/工作需求,很巧,這兩個讀者提的需求都是關(guān)于批量合并sheet(檢索需要的信息)。
本文所用數(shù)據(jù)樣式,經(jīng)讀者同意,可以公開,文件中的數(shù)據(jù)為Excel中的Rand函數(shù)生成,確保大家在學(xué)習(xí)、使用代碼過程中不會遇到障礙,數(shù)據(jù)和代碼獲取方式見文末。
二、基本知識概要
- pandas創(chuàng)建一個DataFrame對象
pd.DataFrame()
- pandas datafrmae索引
按列名索引:dataframe[列名]
按列值索引:dataframe[dataframe[列名]==列值]
- pandas 讀取、存儲excel文件,存儲csv文件
read_excel、to_excel、to_csv
- pandas datafrmae根據(jù)縮影取指定行數(shù)據(jù)
dataframe.loc[list]
- pandas datafrmae修改列名
dataframe.rename(columns={‘column_name_old’:‘column_name_new’})
- pandas datafrmae將數(shù)據(jù)插入到指定列
dataframe.insert(loc=列序號,column=列名,value=列值)
- pandas datafrmae根據(jù)列名刪除指定列
dataframe.drop([列名],axis=1)
- pandas 連接多個datafrmae
pd.concat([df_1, df_2])
三、開始動手動腦
3.1 第一個讀者需求
首先我們先看第一個讀者的需求:原始數(shù)據(jù)有18個Excel文件,每個Excel文件里有34個sheet(34個省的相關(guān)數(shù)據(jù)),需要取出每個sheet中指定的幾行數(shù)據(jù),然后全部合并起來,存儲到一個新的文件,命名為2000_2017年各省份碳排放數(shù)據(jù)。
經(jīng)過溝通,我確定了最終輸出文件的樣式,以下數(shù)據(jù)都是用Excel中的隨機函數(shù)生成:
完成這個需求,如果是手動操作我們需要完成以下幾個步驟:
0、新建一個Excel
1、打開第一個Excel
2、復(fù)制出每個sheet中需要的幾行數(shù)據(jù)
3、將復(fù)制出來的數(shù)據(jù)粘貼到新建的Excel中
4、重復(fù)1-3,直到取出所有Excel中的數(shù)據(jù)
5、保存新建的Excel
如果只是1-2個文件,動手還可以接受,但是要是有幾十個,幾百個,如果靠動手就頭大了。
現(xiàn)在我們看看以上手動操作換成代碼操作需要那些步驟:
0、新建一個數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
1、讀取目標(biāo)Excel文件
2、遍歷取出每個sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
3、for循環(huán)遍歷,讀取所有目標(biāo)Excel數(shù)據(jù),并存儲到新建的Dataframe中
4、將新建的Dataframe數(shù)據(jù)保存為一個Excel文件
了解了這些后,我們就開始愉快的代碼之旅吧:
0、新建一個數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
df_concat = pd.DataFrame() 復(fù)制代碼1、讀取目標(biāo)Excel文件
文件一共有18個文件,文件名也是有規(guī)則的。
2、遍歷取出每個sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
為了代碼的可讀性,這里寫了一個函數(shù)get_sheet_data來取出單個sheet中需要的數(shù)據(jù),然后for循環(huán)遍歷所有的sheet。
3、for循環(huán)遍歷,讀取所有目標(biāo)Excel數(shù)據(jù),并存儲到新建的Dataframe中
在上一步,已經(jīng)讀取出了單個Excel中的所有sheet,現(xiàn)在再利用for循環(huán)遍歷讀取所有Excel中的數(shù)據(jù)。
4、將新建的Dataframe數(shù)據(jù)保存為一個Excel文件
這里直接調(diào)用pandas內(nèi)置的to_excel函數(shù),第一個參數(shù)為文件存儲目錄,第二個參數(shù)為sheet_name,第三個參數(shù)是編碼格式,這里指定為utf-8。
完整代碼如下:
import pandas as pd import time''' 取出單個sheet中需要的數(shù)據(jù) ''' def get_sheet_data(data, sheet_name, year):# 取需要的幾行數(shù)據(jù)df_concat = data[sheet_name].loc[[2,3,48,49]]# 給 Unnamed: 0 列進行重命名df_concat = df_concat.rename(columns={'Unnamed: 0':'類別'})# 插入兩列數(shù)據(jù) 省份 年份df_concat.insert(loc=0,column='省份',value=sheet_name)df_concat.insert(loc=1,column='年份',value=i)# 將Total這列移動到第四列df_temp = df_concat['Total']df_concat = df_concat.drop(['Total'],axis=1) # 先刪除該列df_concat.insert(loc=3,column='Total',value=df_temp) # 然后插入到第四列位置return df_concat''' 取出單個Excel中需要的數(shù)據(jù) ''' def get_excel_data(data, year):df_concat = pd.DataFrame()for sheet_name in list(data.keys()):if sheet_name == 'Sum':continuedf_temp = get_sheet_data(data, sheet_name, year)df_concat = pd.concat([df_concat, df_temp])return df_concat# 0、新建一個數(shù)據(jù)存儲對象(我們用pandas中的Dataframe) df_concat = pd.DataFrame()# 生成一個列表,存儲時間 date_year = [str(i) for i in range(2000, 2018)]# 1、遍歷取出每個Excel中的每個sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中 for i in date_year:file_path = 'data/2000年-2017年碳排放清單/%s年30個省份排放清單.xlsx'%idata = pd.read_excel(file_path, sheet_name=None)df_temp = get_excel_data(data, i)df_concat = pd.concat([df_concat, df_temp])# 2、寫入數(shù)據(jù) print("開始存儲數(shù)據(jù)") df_concat.to_excel("data/2000_2017年省份碳排放數(shù)據(jù).xlsx", "2000_2017", index=None, encoding="utf-8") print("數(shù)據(jù)保存成功") 復(fù)制代碼3.2 第二個讀者需求
我們來看第二個讀者的需求:原數(shù)據(jù)只有一個文件,里面有8個sheet,需要將每個sheet中的幾列取出來,然后根據(jù)日期存儲為一個一個的csv文件。
完成這個需求,如果是手動操作我們需要完成以下幾個步驟:
0、打開Excel文件
1、復(fù)制出每個sheet中需要的幾行數(shù)據(jù)
2、根據(jù)日期進行排序
3、按日期將不同的數(shù)據(jù)存入不同csv文件
看似很簡單,但實際卻是復(fù)雜的,比如要手動創(chuàng)建保存365個csv文件,文件名字還不一樣,想著就頭大!
現(xiàn)在我們看看以上手動操作換成代碼操作需要那些步驟:
0、新建一個數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
1、讀取目標(biāo)Excel文件
2、遍歷取出每個sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
3、根據(jù)日期進行分組,將不同日期數(shù)據(jù)存儲到對應(yīng)的文件
了解了這些后,我們就開始愉快的代碼之旅吧: 0、新建一個數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
df_concat = pd.DataFrame() 復(fù)制代碼1、讀取目標(biāo)Excel文件
file_path = 'data/meteo_china_tmin_2018.xlsx' data = pd.read_excel(file_path, sheet_name=None) 復(fù)制代碼2、遍歷取出每個sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
for sheet_name in list(data.keys()):if sheet_name == 'meteo_china_tmin_2018':continuedf_temp = data[sheet_name][['ymd', 'lat', 'lon', 'tmin']]df_concat = pd.concat([df_concat, df_temp]) 復(fù)制代碼3、根據(jù)日期進行分組,將不同日期數(shù)據(jù)存儲到對應(yīng)的文件
這里根據(jù)日期進行檢索對應(yīng)的數(shù)據(jù),并調(diào)用to_csv函數(shù)存儲數(shù)據(jù),第一個參數(shù)為存儲的目錄,第二個參數(shù)columns為存儲的數(shù)據(jù)列,第三個參數(shù)header=None表示存儲的時候不需要表頭,第四個參數(shù)index=False表示去除索引。
完整代碼:
import pandas as pd''' 讀取、取出需要的數(shù)據(jù)并合并 ''' file_path = './data/meteo_china_tmin_2018.xlsx' data = pd.read_excel(file_path, sheet_name=None) df_concat = pd.DataFrame()for sheet_name in list(data.keys()):if sheet_name == 'meteo_china_tmin_2018':continuedf_temp = data[sheet_name][['ymd', 'lat', 'lon', 'tmin']]df_concat = pd.concat([df_concat, df_temp])''' 按時間進行分組,并保存為csv文件 文件格式:hetao-ymd_tmin ''' # 獲取所有日期 ymd_set = set(df_concat['ymd']) # 循環(huán)操作所有數(shù)據(jù) for ymd in ymd_set:ymd_data = df_concat[df_concat['ymd']==ymd]# 指定存儲的列,并且去掉表頭ymd_data.to_csv('./data/hetao/hetao-%d_tmin.csv'%ymd, columns=['lat', 'lon', 'tmin'], header=None, index=False) 復(fù)制代碼四、隨便說說
大家如果有什么類似需求,可以說下你的需求,按功能點分1 2 3 最好,然后附上示例數(shù)據(jù),歡迎大家進行學(xué)習(xí)交流。
總結(jié)
以上是生活随笔為你收集整理的分享2个Python处理Excel的脚本的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mac 摸鱼神器
- 下一篇: Linux C 数据结构—-循环链表