Python自動複製Excel資料:將各行分別重複指定次數

疯狂学习GIS發表於2024-09-01

  本文介紹基於Python語言,讀取Excel表格檔案資料,並將其中符合我們特定要求那一行加以複製指定的次數,而不符合要求那一行則不復制;並將所得結果儲存為新的Excel表格檔案的方法。

  這裡需要說明,在我們之前的文章多次複製Excel符合要求的資料行:Python批次實現中,也介紹過實現類似需求的另一種Python程式碼,大家如果有需要可以檢視上述文章;而上述文章中的程式碼,由於用到了DataFrame.append()這一個在最新版本pandas庫中取消的方法,因此有的時候可能會出現報錯的情況;且本文中的需求較之上述文章有進一步的提升,因此大家主要參考本文即可。

  首先,我們來明確一下本文的具體需求。現有一個Excel表格檔案,在本文中我們就以.csv格式的檔案為例;其中,如下圖所示,這一檔案中有一列(也就是inf_dif這一列)資料比較關鍵,我們希望對這一列資料加以處理——對於每一行,如果這一行的這一列資料的值在指定的範圍內,那麼就將這一行復制指定的次數(複製的意思相當於就是,新生成一個和當前行一摸一樣資料的新行);而對於符合我們要求的行,其具體要複製的次數也不是固定的,也要根據這一行的這一列資料的值來判斷——比如如果這個資料在某一個值域內,那麼這一行就複製10次;而如果在另一個值域內,這一行就複製50次等。

image

  知道了需求,我們就可以開始程式碼的書寫。其中,本文用到的具體程式碼如下所示。

# -*- coding: utf-8 -*-
"""
Created on Thu Jul  6 22:04:48 2023

@author: fkxxgis
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

original_file_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New/Train_Model_0715.csv"
result_file_path = "E:/01_Reflectivity/99_Model/02_Extract_Data/26_Train_Model_New/Train_Model_0715_Over_NIR_0717_2.csv"

df = pd.read_csv(original_file_path)
duplicated_num_0 = 70
duplicated_num_1 = 35
duplicated_num_2 = 7
duplicated_num_3 = 2

num = [duplicated_num_0 if (value <= -0.12 or value >= 0.12) else duplicated_num_1 if (value <= -0.1 or value >= 0.1) \
else duplicated_num_2 if (value <= -0.07 or value >= 0.07) else duplicated_num_3 if (value <= -0.03 or value >= 0.03) \
else 1 for value in df.inf_dif]
duplicated_df = df.loc[np.repeat(df.index.values, num)]

plt.figure(0)
plt.hist(df["inf_dif"], bins = 50)
plt.figure(1)
plt.hist(duplicated_df["inf_dif"], bins = 50)

duplicated_df.to_csv(result_file_path, index=False)

  其中,上述程式碼的具體含義如下。

  首先,我們需要匯入所需的庫,包括numpypandasmatplotlib.pyplot等,用於後續的資料處理和繪圖操作。接下來,即可開始讀取原始資料,我們使用pd.read_csv()函式讀取檔案,並將其儲存在一個DataFrame物件df中;這裡的原始檔案路徑由original_file_path變數指定。

  隨後,我們開始設定重複次數。在這裡,我們根據特定的條件,為每個值設定重複的次數。根據inf_dif列的值,將相應的重複次數儲存在num列表中。根據不同的條件,使用條件表示式(if-else語句)分別設定了不同的重複次數。

  接下來,我們使用loc函式和np.repeat()函式,將資料按照重複次數複製,並將結果儲存在duplicated_df中。

  最後,為了對比我們資料重複的效果,可以繪製直方圖。在這裡,我們使用matplotlib.pyplot庫中的hist()函式繪製了兩個直方圖;其中,第一個直方圖是原始資料集dfinf_dif列的直方圖,第二個直方圖是複製後的資料集duplicated_dfinf_dif列的直方圖。透過指定bins引數,將資料分成50個區間。

  完成上述操作後,我們即可儲存資料。將複製後的資料集duplicated_df儲存為.csv格式檔案,路徑由result_file_path變數指定。

  執行上述程式碼,我們將獲得如下所示的兩個直方圖;其中,第一個直方圖是原始資料集dfinf_dif列的直方圖,也就是還未進行資料複製的直方圖。

  其次,第二個直方圖是複製後的資料集duplicated_dfinf_dif列的直方圖。

  可以看到,經過前述程式碼的處理,我們原始的資料分佈情況已經有了很明顯的改變。

  至此,大功告成。

相關文章