Как заменить столбец в книге Excel фреймом данных в python

#python #excel #pandas #openpyxl

#python #excel #панды #openpyxl

Вопрос:

Я собрал данные из Интернета, и после некоторой операции я получил такой фрейм данных;

     0       1        2           3
3   BAFRA   0   10000   0.114705
4   BAFRA   100001  300000  0.114705
1   BAFRA   300001  1000000 0.114705
0   BAFRA   1000001 10000000    0.114705
2   BAFRA   10000001    100000000   0.114705
5   BAFRA   100000000   100000001   0.114705
 

Я хочу взять третий столбец и заменить его в существующем файле Excel на определенном листе и в определенный столбец и строку.
Я использую этот код;

 with pd.ExcelWriter(...Gas Settlement Aug20.xlsx",engine="openpyxl") as writer:  
    df[3].to_excel(writer, sheet_name='Unit Prices',header= False, index = False, startcol=12,startrow=24)
import openpyxl 
wb = openpyxl.load_workbook(...Gas Settlement Aug20.xlsx")
ws = wb['Unit Prices']
wb.save(...Gas Settlement Aug20.xlsx")
 

Но он удаляет всю информацию, я попробовал режим «a», но на этот раз он создает новый лист.
Есть ли какой-нибудь способ заменить мои старые данные новыми…

Ответ №1:

Кажется, вы используете сразу два разных подхода: pd.ExcelWriter и openpyxl. Просто следуя приведенному вами образцу, вы можете использовать openpyxl, подобный этому, для обновления вашего файла:

 import openpyxl 
wb = openpyxl.load_workbook("...Gas Settlement Aug20.xlsx")
ws = wb['Unit Prices']
startcol = 12
startrow = 24
for item in df[3]:
    ws.cell(startrow, startcol).value = item
    startrow  =1
wb.save(...Gas Settlement Aug20.xlsx")
 

Но я предлагаю вам не использовать эту форму индексации с числами, потому что легко создавать ошибки и очень сложно найти эти ошибки. В зависимости от размера, даже чтение всего файла, повторное обновление и сохранение будет намного безопаснее и проще для отслеживания.

Комментарии:

1. Этот код проработан. Большое вам спасибо, индексирование с помощью number — это единственный способ, которым я знаю, что все еще пытаюсь улучшить свои навыки. Еще раз спасибо!!!