我在尝试合并多个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 output和This is the actual output我该如何解决这个问题?谢谢!
1条答案
按热度按时间nzrxty8p1#
TLDR:
combined_df = pd.concat(dfs, axis=1)
在我的回答中,我假设每个文件都包含一个工作表。如果没有,则此代码将仅加载每个文件的第一个工作表。
我假设您从excel文件中读取数据,并且您有一个DataFrames列表,每个文件一个。就像这样:
我将在这里创建一些示例数据作为我的答案的一部分,因为我没有访问您的文件。在这里,我有四个文件,每个文件有一到四列,每个文件有28行,正如你的问题中所指定的:
如果所有这些假设都成立,您可以使用以下简单语句组合文件的内容: