Pandalar kullanarak mevcut bir excel dosyasına yeni bir sayfa nasıl kaydedilir?


90

Python ile ayrıntılandırılmış verileri depolamak için excel dosyalarını kullanmak istiyorum. Benim sorunum, mevcut bir excel dosyasına sayfa ekleyememem. Burada, bu soruna ulaşmak için çalışabileceğiniz örnek bir kod öneriyorum.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

Bu kod, iki DataFrame'i sırasıyla "x1" ve "x2" adlı iki sayfaya kaydeder. İki yeni DataFrame oluşturursam ve aynı kodu iki yeni sayfa, "x3" ve "x4" eklemek için kullanmaya çalışırsam, orijinal veriler kaybolur.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

Dört yapraklı bir excel dosyası istiyorum: 'x1', 'x2', 'x3', 'x4'. "Xlsxwriter" ın tek "motor" olmadığını biliyorum, "openpyxl" var. Ayrıca bu konu hakkında yazan başka insanlar olduğunu da gördüm, ancak yine de bunu nasıl yapacağımı anlayamıyorum.

İşte bu bağlantıdan alınan bir kod

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

İşe yaradığını söylüyorlar ama nasıl olduğunu anlamak zor. Bu bağlamda "ws.title", "ws" ve "dict" nedir anlamıyorum.

"X1" ve "x2" yi kaydetmenin, ardından dosyayı kapatmanın, yeniden açmanın ve "x3" ve "x4" eklemenin en iyi yolu hangisidir?

Yanıtlar:


121

Teşekkür ederim. Aynı sorunu yaşayan herkes için eksiksiz bir örneğin iyi olabileceğine inanıyorum:

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

Burada bir excel dosyası oluşturuyorum, anladığım kadarıyla "xslxwriter" veya "openpyxl" motoru aracılığıyla oluşturulup oluşturulmadığı gerçekten önemli değil.

Orijinal verileri kaybetmeden yazmak istediğimde

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

bu kod işi yap!


herhangi bir fikir, neden bunu denediğimde şunu elde ediyorum: ValueError: Excel yazarı yok 'Sales Leads Calculations.xlsx'?
bernando_vialli

1
evet, bu, önceden var olan sayfaları silmeden sayfayı excel'e eklemektir. Teşekkürler!
Nikhil VJ

2
Excel dosyasını kaydederken, mevcut excel çalışma sayfası formatlarını nasıl koruyabilirim?
Vineesh TP

3
Herhangi biri bunu okursa ve writer.sheets = dict((ws.title, ws) for ws in book.worksheets)writer.book = book
yenisini

1
@Stefano Fedele, 'openpyxl' yerine 'xlsxwriter' kullanarak mevcut excel'in aynı güncellemesini yapabilir misiniz?
M Nikesh

15

Paylaştığınız örnekte mevcut dosyayı içine yüklüyor ve olacak değeri bookayarlıyorsunuz . Satırda , çalışma kitabındaki her sayfaya olarak erişiyorsunuz . Sayfa başlığı daha sonra anahtar, değer çiftlerinden oluşan bir sözlük oluşturuyorsunuz . Bu sözlük daha sonra writer.sheets olarak ayarlanır. Esasen bu adımlar sadece mevcut verileri yüklüyor ve yazıcınızı bunlarla dolduruyor.writer.bookbookwriter.sheets = dict((ws.title, ws) for ws in book.worksheets)wsws{sheet_titles: sheet}'Masterfile.xlsx'

Şimdi diyelim ki zaten yapraklı x1ve x2yapraklı bir dosyanız var . Dosyayı yüklemek için örnek kodu kullanmak ve sonra eklemek için böyle bir şey yapabileceğini olabilir x3ve x4.

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

Bu, aradığınız şeyi yapmalıdır.


herhangi bir fikir, neden bunu denediğimde şunu elde ediyorum: ValueError: Excel yazarı yok 'Sales Leads Calculations.xlsx'?
bernando_vialli

18
bu önceden var olan sayfaların silinmesidir.
Nikhil VJ

13

Bir seferde mükemmel olmak için birden çok veri yazmak için basit bir örnek. Ayrıca, yazılı bir excel dosyasındaki (kapalı excel dosyası) bir sayfaya veri eklemek istediğinizde.

İlk kez bir Excel'e yazarken. ("Df1" ve "df2" yi "1st_sheet" ve "2nd_sheet" e yazma)

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

Excel'inizi kapattıktan sonra, ancak aynı excel dosyasındaki ancak başka bir sayfadaki verileri "eklemek" istiyorsanız, "3rd_sheet" sayfa adına "df3" diyelim.

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

Excel formatının xls olmaması gerektiğine dikkat edin, xlsx one kullanabilirsiniz.


1
Bu cevabın ne kattığını anlamıyorum. Aslında, bunun gibi bir bağlam yöneticisinin tekrar tekrar kullanılması, çok daha fazla G / Ç gerektirecektir.
Charlie Clark

8

Artık Pandas DataFrames'ı desteklediği için openpyxl ile doğrudan çalışmanızı şiddetle tavsiye ederim .

Bu, ilgili Excel ve Pandas koduna konsantre olmanızı sağlar.


3
Eğer benzer biraz daha "Pandalar" örneklerini eklemek eğer gerçekten yararlı olacaktır bu
MaxU

Pandalar ile çok fazla iş yapmıyorum, bu yüzden gerçekten bu kadar çok örnek veremem, ancak dokümantasyonda iyileştirmeler yapmaktan memnuniyet duyarım.
Charlie Clark

4

Yeni bir dosya oluşturmak için

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

Dosyaya ekleme için argüman kullanmak mode='a'içinde pd.ExcelWriter.

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

Varsayılan mode ='w'. Belgelere bakın .


3

Openpyxl'deki araçları kullanarak ExcelWriter kullanmadan yapabilir Bu, yeni sayfaya yazı tipi eklemeyi kullanarak çok daha kolay hale getirebilir. openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)

Bu güzel bir çözüm, ancak bunun bir ima olup olmadığından da emin değilim. Bunu ExcelWriteryapamayacağını mı yoksa ihtiyacın olmadığını mı söylüyorsun?
MattSom

Bunu Excelwriter ile yapabilirsiniz, ancak bunu sadece openpyxl kullanarak daha kolay buluyorum.
Jis Mathew

2

İlgi alanlarınızın mevcut sayfalarını, örneğin, 'x1', 'x2', belleğe okuyabilir ve daha fazla yeni sayfa eklemeden önce bunları 'yazabilirsiniz' (bir dosyadaki ve bellekteki sayfaların iki farklı olduğunu unutmayın. şeyler, okumazsanız, kaybolacaklar). Bu yaklaşım sadece 'xlsxwriter' kullanır, openpyxl dahil değildir.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_excel(writer, sheet_name='x1')
df2.to_excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name='x3')
df4.to_excel(writer, sheet_name='x4')
writer.save()
writer.close()

Mevcut tüm sayfaları korumak istiyorsanız, yukarıdaki kodu başlangıç ​​ve bitiş arasında şu şekilde değiştirebilirsiniz:

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_excel(writer, sheet_name=sheet)

1
#This program is to read from excel workbook to fetch only the URL domain names and write to the existing excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:\Users\xyz\Desktop\Python\

l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_excel(r"C:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

2
Bunun soruyla nasıl ilişkili olduğunu takip etmiyorum, excel hakkında olması dışında.
Artog

Mevcut çalışma kitabını okumak ve yazmak için eksiksiz bir çözüm bulmaya çalışıyordum, ancak aynısını bulamadım. Burada mevcut çalışma kitabına nasıl yazılacağına dair bir ipucu buldum, bu yüzden sorunuma eksiksiz bir çözüm vermeyi düşündüm. Umarım temizdir.
nileshk611

0

Bunu yapmanın oldukça basit bir yolu da şöyle bir yöntem yapmaktır:

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_excel(writer, sheet_name, index=False)

Buradaki fikir, çalışma kitabını eğer varsa path_to_file konumuna yüklemek ve ardından data_frame'i sayfa_adı ile yeni bir sayfa olarak eklemektir . Çalışma kitabı yoksa oluşturulur. O ne görünüyor openpyxl veya xlsxwriter ekleme, @Stefano tarafından örnekte olduğu gibi bu nedenle yukarıdaki, gerçekten yüke sahiptir ve daha sonra eklerine yeniden yazmak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.