最近突然看了一下pandas向excel追加數據的方法,發現有很多人出了一些餿主意;
比如用concat,append等方法,這種方法的會先將舊數據df_1讀取到內存,再把新數據df_2與舊的合并,形成df_new,再覆蓋寫入,消耗和速度極大,肯定不聰明;
如果是CSV文件,pandas的to_csv可以直接mode=a追加,畢竟就是一個純文本型文件;
但excel不行,畢竟excel存儲的原理不同,同樣的數據excel要小很多,粗糙地可認為,把很多相似內容,用鍵值對存儲,那么單元格內很多重復的東西,只需要用key值代替,體積就小,但計算開銷大;
1.自己試驗了一下,先說結論:
需求:向EXCEL某個表中,追加數據,不覆蓋原數據,正確高效方法:
df_1為舊數據,存到excel之后,再用pandas read_excel后稱為data_1;
新數據為df_2
import pandas as pdpath =?'d:/test_pd.xlsx'
# 正確方法
with pd.ExcelWriter(path ,mode='a',if_sheet_exists='overlay') as w:df_2.to_excel(w,'Sheet1',index=False,header=False,startrow=df_1.shape[0]+1)
注意:
①ExcelWriter的mode和if_sheet_exists這兩模式要選對;
②startrow,必須指定起始行(默認為0),并且要+1,不然df_2的數據會覆蓋df_1,跟直接df_2.to_excel()沒區別;
2證明:
import pandas as pd
import random
from faker import Faker # 生成假數據的庫
df_1 = pd.DataFrame(columns=['index','name','value'])
# 生成10個數據
fake_instance = Faker("zh_CN")index_1 = [i for i in range(1,11)]
fake_names_1 = [fake_instance.name() for i in range(1,11)]
fake_values_1 = [random.randint(1,100) for i in range(1,11)]
# 寫到dataframe中
temp_list = [index_1,fake_names_1,fake_values_1]
for col,v in zip(df_1.columns,temp_list):df_1[col] = v
# 第一波數據還是把標題帶上,后面就不帶標題了
df_1.to_excel('d:/test_pd.xlsx',index=False,header=True)
df_1
2.1數據如下:
2.2再來一波數據:
index_2 = [i for i in range(11,21)]
fake_names_2 = [fake_instance.name() for i in range(11,21)]
fake_values_2 = [random.randint(1,100) for i in range(11,21)]df_2=pd.DataFrame({'index':index_2,'name':fake_names_2,'value':fake_values_2})
df_2
?
2.3使用簡單而高效正確的方法追加數據:
# 正確方法
with pd.ExcelWriter(path ,mode='a',if_sheet_exists='overlay') as w:df_2.to_excel(w,'Sheet1',index=False,header=False,startrow=df_1.shape[0]+1)
2.4驗證本地數據:
2.5如果不指定startrow,則
觀點來自:
pandas.DataFrame.to_excel:在同一個sheet內追加數據_pandas to excel的mode設置為a,可以再同一個表追加數據么-CSDN博客