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