pandas Excel文件的Python问题,列不是并排书写的

tf7tbtn2  于 2023-05-05  发布在  Python
关注(0)|答案(1)|浏览(172)

我在尝试合并多个Excel文件中的数据时遇到了代码问题。更明确地说:我有多个Excel文件,每个文件都有相同的格式,只有某些列在前28行中填充了数据。例如,在第一个文件中填充的列是:D、E、F、X、Z。在第二个文件中,填充的列是G、H、I、P等。我需要将文件中的列组合起来,并将它们粘贴到最终模板template_sheet2中的相同行,在完全相同的位置(列D应该写在列D上,列E写在列E上,等等)。当运行下面的代码时,第一个文件中的列被写入前28行,但第二个文件中的列从第29行开始写入。

def import_files():
    template_sheet2 = template_wb["TT Matrix"]
    global dfs2
    dfs2 = []
    for excelfile in excelfiles:
        df2 = pd.read_excel(excelfile, sheet_name="TT Matrix", header=None, usecols=lambda col: col not in range(3) and col not in range(-4, 0))
        dfs2.append(df2)
    #concatenates the dataframe
    combined_df2 = pd.concat(dfs2, ignore_index=True, axis=1)
    #columns
    start_col = 4 #starting from column D
    matrix_cols = combined_df2.columns[start_col-4:-4] #get columns starting             from column D, dropping last 4 columns
    for j, col_name in enumerate(matrix_cols):
        col_letter = get_column_letter(j+start_col) #gets the column letter
        template_sheet2[col_letter + "1"].value = col_name #writes column headers

    row_index = 1
    for df in dfs2:
        df = df.iloc[:, :-4] #drop last 4 columns
        df = df.loc[:, df.notna().any()] #only select columns with non-null values
        matrix_cols = df.columns #update matrix_cols to include only selected columns
        for i, row in df.iterrows():
            for j, col_name in enumerate(matrix_cols):
                col_letter = get_column_letter(j+start_col) #gets the column letter
                template_sheet2[col_letter + str(row_index)].value = row[col_name] #copies the data
            row_index += 1

代码更长,但我只添加了与我的问题相关的部分。其他代码不会干扰此工作表。我需要所有的列都写在前28行。我已经尝试在df = df.loc[:, df.notna().any()]上添加axis=1,但这不起作用,并产生布尔错误。This is the desired outputThis is the actual output我该如何解决这个问题?谢谢!

nzrxty8p

nzrxty8p1#

TLDR:combined_df = pd.concat(dfs, axis=1)
在我的回答中,我假设每个文件都包含一个工作表。如果没有,则此代码将仅加载每个文件的第一个工作表。
我假设您从excel文件中读取数据,并且您有一个DataFrames列表,每个文件一个。就像这样:

import pandas as pd

n_files = 5
# Placeholder for the list of paths to your files
paths = [f'path_to_file{i}.xlsx' for i in range(n_files)]

# Load the data into a list of dataframes
dfs = [pd.read_excel(path) for path in paths]

我将在这里创建一些示例数据作为我的答案的一部分,因为我没有访问您的文件。在这里,我有四个文件,每个文件有一到四列,每个文件有28行,正如你的问题中所指定的:

import numpy as np

m_rows = 28

# create a random generator with a fixed seed for reproducibility
rng = np.random.default_rng(seed=42)

columns = [
    ['A', 'B', 'C'],
    ['D'],
    ['E', 'F'],
    ['G', 'H', 'I', 'J'],
]

# create a pandas dataframe with random data and three columns
dfs = [pd.DataFrame(rng.random((m_rows, len(cols))), columns=cols) for cols in columns]

如果所有这些假设都成立,您可以使用以下简单语句组合文件的内容:

combined_df = pd.concat(dfs, axis=1)

相关问题