Python Pandas ExcelWriter 附加到工作表创建一个新工作表

标签 python pandas

我真的很感谢一些帮助。

我正在尝试使用循环来创建工作表,并为每个循环将数据添加到这些工作表中。我的数据的位置是正确的,但是 Panda ExcelWriter 创建一个新工作表,而不是附加到第一次循环运行时创建的工作表。

我是初学者,正确的功能重于形式,所以请原谅我。

我的代码:

import pandas as pd


# initial files for dataframes
excel_file = 'output.xlsx'
setup_file = 'setup.xlsx'

# write to excel
output_filename = 'output_final.xlsx'




df = pd.read_excel(excel_file)  # create dataframe of entire sheet
df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')',
                                                                                                       '')  # clean dataframe titles

df_setup = pd.read_excel(setup_file)
df_setup.columns = df_setup.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')',
                                                                                                                   '')  # clean dataframe titles

df_2 = pd.merge(df, df_setup)  # Merge data with setup to have krymp size for each wire in dataframe

df_2['wirelabel'] = "'" + df_2['cable'] + "_" + df_2['function_code'] + "-" + df_2['terminal_strip'] + ":" + df_2[
    'terminal']  # creates column for the wirelabel by appending columns with set delimiters. #TODO: delimiters to be by inputs.

df_2.sort_values(by=['switchboard'])  # sort so we get proper order

switchboard_unique = df.switchboard.unique().tolist()  # crate variable containing unique switchboards for printing to excel sheets


def createsheets(output_filename, sheetname, row_start, column_start, df_towrite):
    with pd.ExcelWriter(output_filename, engine='openpyxl', mode='a') as writer:
        df_towrite.to_excel(writer, sheet_name=sheetname, columns=['wirelabel'], startrow=row_start, startcol=column_start, index=False, header=False)
        writer.save()
        writer.close()

def sorter():
    for s in switchboard_unique:
        df_3 = df_2.loc[df_2['switchboard'] == s]
        krymp_unique = df_3.krymp.unique().tolist()
        krymp_unique.sort()
        # print(krymp_unique)
        column_start = 0
        row_start = 0
        for k in krymp_unique:
            df_3.loc[df_3['krymp'] == k]
            # print(k)
            # print(s)
            # print(df_3['wirelabel'])
            createsheets(output_filename, s, row_start, column_start, df_3)
            column_start = column_start + 1

sorter()

当前行为:

如果sheetname是=sheet,那么我的脚本会创建sheet1、sheet2、sheet3..等。

pictureofcurrent

想要的行为

为“df_3”中的每一项创建一个sheet,并根据column_start中计算的位置将数据放入列中。我的代码中的位置有效,只是转到了错误的工作表。

pictureofwanted

我希望大家清楚我想要实现的目标,并感谢所有帮助。 我尝试了所有关于写入 Excel 的示例代码。

最佳答案

我知道我的代码不是一件艺术品,但为了完整性,以及如果有人偶然发现这篇文章,我将用我自己问题的答案来更新这篇文章。

事实证明我误解了 Pandas“pd.ExcelWriter”中“append”函数的功能。无法附加到已存在的工作表,尽管模式设置为“a”,但该工作表将被覆盖。

意识到这一点,我更改了代码来为整个工作表(df_sheet)构建数据框,然后在代码中调用“createsheets”函数。第一个版本逐列写入我的数据。

“最终”代码:

import pandas as pd

# initial files for dataframes
excel_file = 'output.xlsx'
setup_file = 'setup.xlsx'

# write to excel
output_filename = 'output_final.xlsx'
column_name = 0

df = pd.read_excel(excel_file)  # create dataframe of entire sheet
df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')',
                                                                                                       '')  # clean dataframe titles

df_setup = pd.read_excel(setup_file)
df_setup.columns = df_setup.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')',
                                                                                                                   '')  # clean dataframe titles

df_2 = pd.merge(df, df_setup)  # Merge data with setup to have krymp size for each wire in dataframe

df_2['wirelabel'] = "'" + df_2['cable'] + "_" + df_2['function_code'] + "-" + df_2['terminal_strip'] + ":" + df_2[
    'terminal']  # creates column for the wirelabel by appending columns with set delimiters. #TODO: delimiters to be by inputs.

df_2.sort_values(by=['switchboard'])  # sort so we get proper order

switchboard_unique = df.switchboard.unique().tolist()  # crate variable containing unique switchboards for printing to excel sheets




def createsheets(output_filename, sheetname, df_towrite):
    with pd.ExcelWriter(output_filename, engine='openpyxl', mode='a') as writer:
        df_towrite.to_excel(writer, sheet_name=sheetname, index=False, header=True)


def to_csv_file(output_filename, df_towrite):
    df_towrite.to_csv(output_filename, mode='w', index=False)

def sorter():
    for s in switchboard_unique:
        df_3 = df_2.loc[df_2['switchboard'] == s]

        krymp_unique = df_3.krymp.unique().tolist()
        krymp_unique.sort()

        column_start = 0
        row_start = 0
        df_sheet = pd.DataFrame([])

        for k in krymp_unique:
            df_5 = df_3.loc[df_3['krymp'] == k]
            df_4 = df_5.filter(['wirelabel'])


            column_name = "krymp " + str(k) + " Tavle: " + str(s)

            df_4 = df_4.rename(columns={"wirelabel": column_name})
            df_4 = df_4.reset_index(drop=True)
            df_sheet = pd.concat([df_sheet, df_4], axis=1)

            column_start = column_start + 1
            row_start = row_start + len(df_5.index) + 1

        createsheets(output_filename, s, df_sheet)
        to_csv_file(s + ".csv", df_sheet)


sorter()


谢谢。

关于Python Pandas ExcelWriter 附加到工作表创建一个新工作表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61457800/

相关文章:

python - Pandas 多索引切片 "Level type mismatch"

python - 我可以使方法成为生成器而不是返回生成器吗?

python - 到达 EOF 时如何使用 itertools.islice 停止迭代

Python/Django - 创建后编辑模型表单

python-3.x - Pandas 中的read_table和read_csv之间有区别吗?

python - 如果文件在 Excel 中打开,pd.read_excel 会抛出 PermissionError

python - 使用循环按 pd.dataframe 的列生成列表

python - 如何将数据框的列值拆分为多列

python - 如何从 enaml.stdlib.sessions 导入 show_simple_view?

python - 带有类别的 pyplot 条形图