web-dev-qa-db-fra.com

Python Pandas - Comment écrire dans une colonne spécifique dans une feuille Excel

J'ai du mal à mettre à jour une feuille Excel en utilisant pandas en y écrivant de nouvelles valeurs. J'ai déjà un cadre df1 existant qui lit les valeurs de MySheet1.xlsx. Donc cela doit être soit un nouveau dataframe ou en quelque sorte pour copier et écraser celui existant.

La feuille de calcul est dans ce format:

enter image description here

J'ai un python list: values_list = [12.34, 17.56, 12.45]. Mon objectif est d'insérer verticalement les valeurs de la liste sous l'en-tête Col_C. Il écrase actuellement l'intégralité de la trame de données horizontalement, sans préserver la valeurs actuelles.

df2 = pd.DataFrame({'Col_C': values_list})
writer = pd.ExcelWriter('excelfile.xlsx', engine='xlsxwriter')
df2.to_Excel(writer, sheet_name='MySheet1')
workbook  = writer.book
worksheet = writer.sheets['MySheet1']

Comment obtenir ce résultat final? Je vous remercie!

enter image description here

6
kokodee

Ci-dessous, j'ai fourni un exemple entièrement reproductible de la façon dont vous pouvez modifier un classeur .xlsx existant en utilisant pandas et le module openpyxl ((lien vers Openpyxl Docs) .

Tout d'abord, à des fins de démonstration, je crée un classeur appelé test.xlsx:

from openpyxl import load_workbook
import pandas as pd
writer = pd.ExcelWriter('test.xlsx', engine='openpyxl') 
wb  = writer.book
df = pd.DataFrame({'Col_A': [1,2,3,4],
                  'Col_B': [5,6,7,8],
                  'Col_C': [0,0,0,0],
                  'Col_D': [13,14,15,16]})

df.to_Excel(writer, index=False)
wb.save('test.xlsx')

Voici la sortie attendue à ce stade:

Expected Output after first section of code

Dans cette deuxième partie, nous chargeons le classeur existant ('test.xlsx') et modifions la troisième colonne avec des données différentes.

from openpyxl import load_workbook
import pandas as pd
df_new = pd.DataFrame({'Col_C': [9, 10, 11, 12]})
wb = load_workbook('test.xlsx')

ws = wb['Sheet1']

for index, row in df_new.iterrows():
    cell = 'C%d'  % (index + 2)
    ws[cell] = row[0]

wb.save('test.xlsx')

Voici la sortie attendue à la fin:

enter image description here

6
patrickjlong1

À mon avis, la solution la plus simple est de lire l'Excel en tant que trame de données d'un panda, de le modifier et de l'écrire en Excel. Ainsi, par exemple:

Commentaires:

Importez pandas en tant que pd. Lisez la feuille Excel dans pandas trame de données appelée. Prenez vos données, qui pourraient être dans un format de liste, et affectez-les à la colonne que vous voulez (assurez-vous simplement que les longueurs sont les mêmes). Enregistrez votre bloc de données en tant qu'Excel, soit remplacez l'ancien Excel, soit créez-en un nouveau.

Code:

import pandas as pd;
ExcelDataInPandasDataFrame = pd.read_Excel("./YourExcel.xlsx");
YourDataInAList = [12.34,17.56,12.45];
ExcelDataInPandasDataFrame ["Col_C"] = YourDataInAList ;
ExcelDataInPandasDataFrame .to_Excel("./YourNewExcel.xlsx",index=False);
3
Elmspace