Python實(shí)現(xiàn)對(duì)大量表格文件數(shù)據(jù)處理的方法詳解
本文介紹基于Python語(yǔ)言,針對(duì)一個(gè)文件夾下大量的Excel表格文件,基于其中每一個(gè)文件,首先依據(jù)某一列數(shù)據(jù)的特征截取我們需要的數(shù)據(jù),隨后對(duì)截取出來(lái)的數(shù)據(jù)逐行求差,并基于其他多個(gè)文件夾中同樣大量的Excel表格文件,進(jìn)行數(shù)據(jù)跨文件合并的具體方法。
首先,我們來(lái)明確一下本文的具體需求?,F(xiàn)有一個(gè)文件夾,其中有大量的Excel表格文件(在本文中我們就以.csv
格式的文件為例),且每一個(gè)文件的名稱都表示該文件對(duì)應(yīng)的數(shù)據(jù)源點(diǎn)的ID
;如下圖所示。
其中,每一個(gè)Excel表格文件都有著如下圖所示的數(shù)據(jù)格式;其中的第1
列,是表示天數(shù)的時(shí)間數(shù)據(jù),每一行數(shù)據(jù)之間的時(shí)間跨度是8
天。
我們希望實(shí)現(xiàn)的是,首先對(duì)于這個(gè)文件夾中的每一個(gè)文件,都截取出其中天數(shù)在2022001
(也就是2022
年第1
天)及之后的部分;隨后,對(duì)截取出來(lái)的數(shù)據(jù)的各列(除了第1
列,因?yàn)榈?code>1列是表示時(shí)間的數(shù)據(jù))加以逐行求差——例如,用2022009
的數(shù)據(jù)減去2022001
的數(shù)據(jù),隨后用2022017
的數(shù)據(jù)減去2022009
的數(shù)據(jù),并將差值作為新的幾列放在原有的幾列后面;還有,我們還希望從當(dāng)前文件的文件名、以及第1
列的天數(shù)中,提取出一些關(guān)鍵信息,作為新的列放在后面(我這里是希望生產(chǎn)一個(gè)深度神經(jīng)網(wǎng)絡(luò)回歸的訓(xùn)練數(shù)據(jù),所以就需要組合各類(lèi)的數(shù)據(jù))。此外,我們還有2
個(gè)文件夾,其中有著同樣大量、同樣文件命名規(guī)則、同樣數(shù)據(jù)格式的數(shù)據(jù),我們希望將這2
個(gè)文件夾中與當(dāng)前文件夾中每一個(gè)同名的文件中的同一天的數(shù)據(jù)合并。
了解了需求,我們就可以開(kāi)始代碼的書(shū)寫(xiě)。本文用到的代碼如下所示。
# -*- coding: utf-8 -*- """ Created on Thu May 18 11:36:41 2023 @author: fkxxgis """ import os import numpy as np import pandas as pd original_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/17_HANTS" era5_path = "E:/01_Reflectivity/99_Model_Training/00_Data/03_Meteorological_Data/02_AllERA5" history_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/18_AllYearAverage_2" output_path = "E:/01_Reflectivity/99_Model_Training/00_Data/02_Extract_Data/19_2022Data" era5_files = os.listdir(era5_path) history_files = os.listdir(history_path) for file in os.listdir(original_path): file_path = os.path.join(original_path, file) if file.endswith(".csv") and os.path.isfile(file_path): point_id = file[4 : -4] df = pd.read_csv(file_path) filter_df = df[df["DOY"] >= 2022001] filter_df = filter_df.reset_index(drop = True) filter_df["blue_dif"] = filter_df["blue"].diff() filter_df["green_dif"] = filter_df["green"].diff() filter_df["red_dif"] = filter_df["red"].diff() filter_df["inf_dif"] = filter_df["inf"].diff() filter_df["si1_dif"] = filter_df["si1"].diff() filter_df["si2_dif"] = filter_df["si2"].diff() filter_df["NDVI_dif"] = filter_df["NDVI"].diff() filter_df["PointType"] = file[4 : 7] filter_df["days"] = filter_df["DOY"] % 1000 for era5_file in era5_files: if point_id in era5_file: era5_df = pd.read_csv(os.path.join(era5_path, era5_file)) rows_num = filter_df.shape[0] for i in range(rows_num): day = filter_df.iloc[i, 0] row_need_index = era5_df.index[era5_df.iloc[ : , 1] == day] row_need = row_need_index[0] sola_data_all = era5_df.iloc[row_need - 2 : row_need, 2] temp_data_all = era5_df.iloc[row_need - 6 : row_need - 2, 3] prec_data_all = era5_df.iloc[row_need - 5 : row_need - 1, 4] soil_data_all = era5_df.iloc[row_need - 6 : row_need - 2, 5 : 7 + 1] sola_data = np.sum(sola_data_all.values) temp_data = np.sum(temp_data_all.values) prec_data = np.sum(prec_data_all.values) soil_data = np.sum(soil_data_all.values) filter_df.loc[i, "sola"] = sola_data filter_df.loc[i, "temp"] = temp_data filter_df.loc[i, "prec"] = prec_data filter_df.loc[i, "soil"] = soil_data break for history_file in history_files: if point_id in history_file: history_df = pd.read_csv(os.path.join(history_path, history_file)).iloc[ : , 1 : ] history_df.columns = ["blue_h", "green_h", "red_h", "inf_h", "si1_h", "si2_h", "ndvi_h"] break filter_df_new = pd.concat([filter_df, history_df], axis = 1) output_file = os.path.join(output_path, file) filter_df_new.to_csv(output_file, index = False)
代碼中首先定義了幾個(gè)文件夾路徑,分別是原始數(shù)據(jù)文件夾(也就是本文開(kāi)頭第1
張圖所示的文件夾)、ERA5氣象數(shù)據(jù)文件夾、歷史數(shù)據(jù)文件夾和輸出文件夾。然后,通過(guò) os.listdir()
函數(shù)獲取了ERA5氣象數(shù)據(jù)文件夾和歷史數(shù)據(jù)文件夾中的所有文件名,并在后續(xù)的循環(huán)中使用。
接下來(lái)是一個(gè) for
循環(huán),遍歷了原始數(shù)據(jù)文件夾中的所有.csv
文件,如果文件名以 .csv
結(jié)尾并且是一個(gè)合法的文件,則讀取該文件。然后,根據(jù)文件名提取了點(diǎn)ID
,并使用Pandas中的 read_csv()
函數(shù)讀取了該文件的數(shù)據(jù)。接著,使用Pandas中的 loc[]
函數(shù)對(duì)數(shù)據(jù)進(jìn)行了處理,包括篩選出DOY
大于等于 2022001
的行,將其重置索引,并計(jì)算了反射率數(shù)據(jù)的差值。然后,將一些元數(shù)據(jù)添加到篩選后的數(shù)據(jù)中,包括點(diǎn)類(lèi)型和天數(shù)。
接下來(lái)是兩個(gè) for
循環(huán),分別用于處理ERA5氣象數(shù)據(jù)和歷史數(shù)據(jù)。在處理ERA5氣象數(shù)據(jù)時(shí),首先找到與當(dāng)前點(diǎn)ID
匹配的ERA5氣象數(shù)據(jù)文件,并使用Pandas中的 read_csv()
函數(shù)讀取了該文件的數(shù)據(jù)。然后,使用 iloc[]
函數(shù)根據(jù)當(dāng)前日期找到了ERA5氣象數(shù)據(jù)中對(duì)應(yīng)的行,并從該行及其前兩行中提取了太陽(yáng)輻射、溫度、降水和土壤濕度數(shù)據(jù)。最后,將這些數(shù)據(jù)添加到篩選后的數(shù)據(jù)中。
在處理歷史數(shù)據(jù)時(shí),首先找到與當(dāng)前點(diǎn)ID
匹配的歷史數(shù)據(jù)文件,并使用Pandas中的 read_csv()
函數(shù)讀取了該文件的數(shù)據(jù)。然后,使用 iloc[]
函數(shù)刪除了第一列,并將剩余列重命名為blue_h
、green_h
、red_h
、inf_h
、si1_h
、si2_h
和 ndvi_h
。最后,使用Pandas中的 concat()
函數(shù)將篩選后的數(shù)據(jù)和歷史數(shù)據(jù)合并成一個(gè)新的DataFrame
。
最后,使用Pandas中的 to_csv()
函數(shù)將新的DataFrame
保存到輸出文件夾中。
運(yùn)行上述代碼,我們即可得到無(wú)數(shù)個(gè)組合后的Excel表格文件,其中每一個(gè)文件的列都如下圖所示,已經(jīng)是我們合并了各類(lèi)信息之后的了。
這樣,就完成了我們神經(jīng)網(wǎng)絡(luò)訓(xùn)練數(shù)據(jù)集的生產(chǎn)過(guò)程。
至此,大功告成。
到此這篇關(guān)于Python實(shí)現(xiàn)對(duì)大量表格文件數(shù)據(jù)處理的方法詳解的文章就介紹到這了,更多相關(guān)Python表格內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法詳解
這篇文章主要介紹了VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法,較為詳細(xì)的分析了VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的具體步驟、相關(guān)命令與操作注意事項(xiàng),需要的朋友可以參考下2019-07-07Python 3中print函數(shù)的使用方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于Python 3中print函數(shù)的使用方法,python3中的print函數(shù)和之前版本的用法相差很多,本文通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-08-08基于python tornado實(shí)現(xiàn)圖床功能
因?yàn)橘I(mǎi)了阿里/騰訊的云服務(wù)器,但是使用云存儲(chǔ)還需要收費(fèi),又加上家里正好有一臺(tái)nas,又加上閑的沒(méi)事,所以搞了一個(gè)小腳本,這個(gè)項(xiàng)目主要功能是為typora增加一個(gè)自定義圖床,本文給大家介紹基于python tornado實(shí)現(xiàn)圖床功能,感興趣的朋友一起看看吧2023-08-08Python之tkinter列表框Listbox與滾動(dòng)條Scrollbar解讀
這篇文章主要介紹了Python之tkinter列表框Listbox與滾動(dòng)條Scrollbar解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05