<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分享2個(gè)Python處理Excel的腳本

          共 9622字,需瀏覽 20分鐘

           ·

          2021-05-09 01:54

          ↑↑↑關(guān)注后"星標(biāo)"簡說Python

          人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析
           簡說Python發(fā)布 
          來源:簡說Python
          作者:老表

          大家好,我是老表!
          今天給大家分享2個(gè)Python處理Excel的小技巧(腳本)。

          寫在前面

          來源于兩個(gè)讀者的學(xué)習(xí)/工作需求,很巧,這兩個(gè)讀者提的需求都是關(guān)于批量合并sheet(檢索需要的信息)。

          本文所用數(shù)據(jù)樣式,經(jīng)讀者同意,可以公開,文件中的數(shù)據(jù)為Excel中的Rand函數(shù)生成,確保大家在學(xué)習(xí)、使用代碼過程中不會遇到障礙,數(shù)據(jù)和代碼獲取方式見文末。

          來自讀者的認(rèn)可,嘿嘿

          基本知識概要

          • pandas創(chuàng)建一個(gè)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 連接多個(gè)datafrmae
            pd.concat([df_1, df_2])

          開始動手動腦

          第一個(gè)讀者需求

          首先我們先看第一個(gè)讀者的需求:原始數(shù)據(jù)有18個(gè)Excel文件,每個(gè)Excel文件里有34個(gè)sheet(34個(gè)省的相關(guān)數(shù)據(jù)),需要取出每個(gè)sheet中指定的幾行數(shù)據(jù),然后全部合并起來,存儲到一個(gè)新的文件,命名為2000_2017年各省份碳排放數(shù)據(jù)。

          經(jīng)過溝通,我確定了最終輸出文件的樣式,以下數(shù)據(jù)都是用Excel中的隨機(jī)函數(shù)生成:

          完成這個(gè)需求,如果是手動操作我們需要完成以下幾個(gè)步驟:

          0、新建一個(gè)Excel
          1、打開第一個(gè)Excel
          2、復(fù)制出每個(gè)sheet中需要的幾行數(shù)據(jù)
          3、將復(fù)制出來的數(shù)據(jù)粘貼到新建的Excel中
          4、重復(fù)1-3,直到取出所有Excel中的數(shù)據(jù)
          5、保存新建的Excel

          如果只是1-2個(gè)文件,動手還可以接受,但是要是有幾十個(gè),幾百個(gè),如果靠動手就頭大了。
          現(xiàn)在我們看看以上手動操作換成代碼操作需要那些步驟:

          0、新建一個(gè)數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
          1、讀取目標(biāo)Excel文件
          2、遍歷取出每個(gè)sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
          3、for循環(huán)遍歷,讀取所有目標(biāo)Excel數(shù)據(jù),并存儲到新建的Dataframe中
          4、將新建的Dataframe數(shù)據(jù)保存為一個(gè)Excel文件

          了解了這些后,我們就開始愉快的代碼之旅吧:

          0、新建一個(gè)數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)

          df_concat = pd.DataFrame()

          1、讀取目標(biāo)Excel文件
          文件一共有18個(gè)文件,文件名也是有規(guī)則的。

          file_path = 'data/2000年-2017年碳排放清單/2000年30個(gè)省份排放清單.xlsx'
          data = pd.read_excel(file_path, sheet_name=None)

          2、遍歷取出每個(gè)sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
          為了代碼的可讀性,這里寫了一個(gè)函數(shù)get_sheet_data來取出單個(gè)sheet中需要的數(shù)據(jù),然后for循環(huán)遍歷所有的sheet。

          '''
          取出單個(gè)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 列進(jìn)行重命名
              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
              
          for sheet_name in list(data.keys()):
                  if sheet_name == 'Sum':
                      continue
                  df_temp = get_sheet_data(data, sheet_name, year)
                  df_concat = pd.concat([df_concat, df_temp])

          3、for循環(huán)遍歷,讀取所有目標(biāo)Excel數(shù)據(jù),并存儲到新建的Dataframe中
          在上一步,已經(jīng)讀取出了單個(gè)Excel中的所有sheet,現(xiàn)在再利用for循環(huán)遍歷讀取所有Excel中的數(shù)據(jù)。

          '''
          取出單個(gè)Excel中需要的數(shù)據(jù)
          '''

          def get_excel_data(data, year):
              df_concat = pd.DataFrame()
              for sheet_name in list(data.keys()):
                  if sheet_name == 'Sum':
                      continue
                  df_temp = get_sheet_data(data, sheet_name, year)
                  df_concat = pd.concat([df_concat, df_temp])
              return df_concat

          # 生成一個(gè)列表,存儲時(shí)間
          date_year = [str(i) for i in range(20002018)]
          for i in date_year:
              file_path = 'data/2000年-2017年碳排放清單/%s年30個(gè)省份排放清單.xlsx'%i
              data = pd.read_excel(file_path, sheet_name=None)
              df_temp = get_excel_data(data, i)
              df_concat = pd.concat([df_concat, df_temp])

          4、將新建的Dataframe數(shù)據(jù)保存為一個(gè)Excel文件
          這里直接調(diào)用pandas內(nèi)置的to_excel函數(shù),第一個(gè)參數(shù)為文件存儲目錄,第二個(gè)參數(shù)為sheet_name,第三個(gè)參數(shù)是編碼格式,這里指定為utf-8。

          print("開始存儲數(shù)據(jù)")
          df_concat.to_excel("data/2000_2017年省份碳排放數(shù)據(jù).xlsx""2000_2017", index=None, encoding="utf-8")
          print("數(shù)據(jù)保存成功")

          完整代碼如下:

          import pandas as pd
          import time

          '''
          取出單個(gè)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 列進(jìn)行重命名
              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

          '''
          取出單個(gè)Excel中需要的數(shù)據(jù)
          '''

          def get_excel_data(data, year):
              df_concat = pd.DataFrame()
              for sheet_name in list(data.keys()):
                  if sheet_name == 'Sum':
                      continue
                  df_temp = get_sheet_data(data, sheet_name, year)
                  df_concat = pd.concat([df_concat, df_temp])
              return df_concat
            
          # 0、新建一個(gè)數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
          df_concat = pd.DataFrame()

          # 生成一個(gè)列表,存儲時(shí)間
          date_year = [str(i) for i in range(20002018)]

          # 1、遍歷取出每個(gè)Excel中的每個(gè)sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
          for i in date_year:
              file_path = 'data/2000年-2017年碳排放清單/%s年30個(gè)省份排放清單.xlsx'%i
              data = 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ù)保存成功")

          第二個(gè)讀者需求

          我們來看第二個(gè)讀者的需求:原數(shù)據(jù)只有一個(gè)文件,里面有8個(gè)sheet,需要將每個(gè)sheet中的幾列取出來,然后根據(jù)日期存儲為一個(gè)一個(gè)的csv文件。

          完成這個(gè)需求,如果是手動操作我們需要完成以下幾個(gè)步驟:

          0、打開Excel文件
          1、復(fù)制出每個(gè)sheet中需要的幾行數(shù)據(jù)
          2、根據(jù)日期進(jìn)行排序
          3、按日期將不同的數(shù)據(jù)存入不同csv文件

          看似很簡單,但實(shí)際卻是復(fù)雜的,比如要手動創(chuàng)建保存365個(gè)csv文件,文件名字還不一樣,想著就頭大!

          現(xiàn)在我們看看以上手動操作換成代碼操作需要那些步驟:

          0、新建一個(gè)數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)
          1、讀取目標(biāo)Excel文件
          2、遍歷取出每個(gè)sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中
          3、根據(jù)日期進(jìn)行分組,將不同日期數(shù)據(jù)存儲到對應(yīng)的文件

          了解了這些后,我們就開始愉快的代碼之旅吧:0、新建一個(gè)數(shù)據(jù)存儲對象(我們用pandas中的Dataframe)

          df_concat = pd.DataFrame()

          1、讀取目標(biāo)Excel文件

          file_path = 'data/meteo_china_tmin_2018.xlsx'
          data = pd.read_excel(file_path, sheet_name=None)

          2、遍歷取出每個(gè)sheet中需要的幾行數(shù)據(jù),存儲到新建的Dataframe中

          for sheet_name in list(data.keys()):
              if sheet_name == 'meteo_china_tmin_2018':
                  continue
              df_temp = data[sheet_name][['ymd''lat''lon''tmin']]
              df_concat = pd.concat([df_concat, df_temp])

          3、根據(jù)日期進(jìn)行分組,將不同日期數(shù)據(jù)存儲到對應(yīng)的文件
          這里根據(jù)日期進(jìn)行檢索對應(yīng)的數(shù)據(jù),并調(diào)用to_csv函數(shù)存儲數(shù)據(jù),第一個(gè)參數(shù)為存儲的目錄,第二個(gè)參數(shù)columns為存儲的數(shù)據(jù)列,第三個(gè)參數(shù)header=None表示存儲的時(shí)候不需要表頭,第四個(gè)參數(shù)index=False表示去除索引。

          '''
          按時(shí)間進(jìn)行分組,并保存為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)

          完整代碼:

          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':
                  continue
              df_temp = data[sheet_name][['ymd''lat''lon''tmin']]
              df_concat = pd.concat([df_concat, df_temp])

          '''
          按時(shí)間進(jìn)行分組,并保存為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)

          隨便說說

          五一結(jié)束,祝大家新的一周搬磚快樂。

          另外大家如果有什么類似需求,或者想要本文所有相關(guān)樣例數(shù)據(jù)和代碼的,可以掃下方二維碼添加我的微信,查看朋友圈獲取。
          歡迎大家進(jìn)行學(xué)習(xí)交流。

          --END--


          掃碼即可加我微信

          觀看朋友圈,獲取最新學(xué)習(xí)資源


          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機(jī)器學(xué)習(xí)等方面,別再說不知道該從哪開始,實(shí)戰(zhàn)哪里找了

          點(diǎn)贊”傳統(tǒng)美德不能丟 

          瀏覽 72
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产精品女人久久久久 | 午夜成人精品视频免费在线观看 | 日本爱爱视频网站 | 99在线视频在线 | 亚洲二页 |