簡體   English   中英

熊貓:如何在同一工作表的現有xlsx文件中寫入數據而不會覆蓋舊數據

[英]pandas: how to write data in a existing xlsx file in the same sheet without overwriting the old data

我現在有一個很大的csv文件(18GB),我想分塊讀取它然后進行處理。

我這里有兩個問題:

  1. 我如何檢查最后一個塊是否包含NaN,因為csv文件的總長度無法按塊大小划分為整數

  2. 如何在不覆蓋舊數據的情況下將新數據寫入此現有xlsx文件。

這是代碼:

chunkSize=6666800
periode=333340
for chunk in pd.read_csv('/Users/gaoyingqiang/Desktop/D970_Leistung.csv',delimiter=';',encoding='gbk',iterator=True,chunksize=chunkSize):
    U1=chunk['Kanal 1-1 [V]']
    I1=chunk['Kanal 1-2 [V]']
    c=[]
    if chunk.isnull.values.any():
        break #here I tried to check the last chunk whether it contains NaN or 0 by check the last elements in U1 to avoid the ZeroDivisionError. But the error was like AttributeError: 'function' object has no attribute 'values'
    for num in range(0,chunkSize, periode):
        lu = sum(U1[num:num + periode] * U1[num:num + periode]) / periode
        li = sum(I1[num:num + periode] * I1[num:num + periode]) / periode
        lui = sum(I1[num:num + periode] * U1[num:num + periode]) / periode
        c.append(180 * mt.acos(2 * lui / mt.sqrt(4 * lu * li)) / np.pi)
        lu = 0
        li = 0
        lui = 0

book=load_workbook('/Users/gaoyingqiang/Desktop/Phaseverschiebung_1.xlsx')
writer=pd.ExcelWriter('/Users/gaoyingqiang/Desktop/Phaseverschiebung_1.xlsx',engine='openpyxl')
writer.book=book
writer.sheets=dict((ws.title,ws) for ws in book.worksheets)

phase = pd.DataFrame(c)
phase.to_excel(writer,'Main')
writer.save() #I found it keeps overwriting.

這是數據的結構: 在此處輸入圖片說明

而且if chunk.isnull.values.any()出現錯誤

在此處輸入圖片說明

如果我不執行此NaN檢查,然后 在此處輸入圖片說明

那么哪里出了問題?

如果要將所有塊都寫到同一張表中,請嘗試以下代碼:

定義一個變量rowLength,對於第一個塊,rowLength應該為零,然后將值增加chunksize

rowLength = 0                        #for 1st chunk
rowLength = rowLength + chunksize

然后通過指定startrow將塊寫入excel

phase = pd.DataFrame(c)
phase.to_excel(writer,'Main', startrow=rowLength, index=False)

熊貓to_excel 文檔供您參考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM