pandas动态识别标题行-合并多个xlsx文件

brjng4g3  于 2023-09-29  发布在  其他
关注(0)|答案(3)|浏览(92)

我有10个Excel工作表,每个工作表预计相同的标题/列名。
文件名为ABC.xlsxDEF_123.xlsx等。excel文件名中没有命名通配符模式。
我的问题是,一些Excel文件的标题出现在第一行本身。而对于一些Excel文件,它可能出现在第2行(第1行是空的),对于一些文件,它可能出现在第5行(前4行是空的)。
我的目标是做到以下几点
a)将来自每个excel文件的数据组合/垂直堆叠到一个 Dataframe 中
所以,我尝试了下面的

record_counts = []
dfs=[]
folder_path = Path.cwd()
filenames = sorted(glob.glob(str(folder_path)+"\*.xlsx"))

for f in filenames:
    filename = os.path.basename(f)
    df = pd.read_excel(filename, header=None)
    header_row = 0
    if df.iloc[0].isna().all():
        header_row = 1
    df = pd.read_excel(filename, header=header_row)
    count = len(df.index)
    record_counts.append(count)
    dfs.append(df)
combined_df = pd.concat(dfs, ignore_index=True)

但是上面的代码假设标题出现在第一行(第0个位置)。如果不是,那么我们看第一位置(第二行)。但这是硬编码。
我如何识别标题动态出现的行并从那里获取数据?

mu0hgdu0

mu0hgdu01#

你需要的只是一个正确的逻辑来识别第一个非空行:

record_counts = []
dfs=[]
folder_path = Path.cwd()
filenames = sorted(glob.glob(str(folder_path)+"\*.xlsx"))

for f in filenames:
    filename = os.path.basename(f)
    df = pd.read_excel(filename, header=None)
    
    # Identify the header row as the first non-empty row
    header_row = df.apply(lambda row: row.notnull().any(), axis=1).idxmax()

    # Set the selected row as the header
    df.columns = df.iloc[header_row]

    # Drop the rows before the header row
    df = df.iloc[header_row + 1:]
    dfs.append(df)
combined_df = pd.concat(dfs, ignore_index=True)
kq0g1dla

kq0g1dla2#

试试这个:

import os
import glob
from pathlib import Path
import pandas as pd

record_counts = []
dfs = []
folder_path = Path.cwd()
filenames = sorted(glob.glob(str(folder_path) + "/*.xlsx"))

def find_header_row(df):
    for i, row in df.iterrows():
        if 'ColumnName' in row.values:  
            return i
    return 0

for f in filenames:
    filename = os.path.basename(f)
    df_temp = pd.read_excel(f, header=None)
    header_row = find_header_row(df_temp)
    
    df = pd.read_excel(f, header=header_row)
    count = len(df.index)
    record_counts.append(count)
    dfs.append(df)
    
combined_df = pd.concat(dfs, ignore_index=True)
vom3gejh

vom3gejh3#

我设法找到了另一种方法来解决这个问题,通过识别first valid index

for f in filenames:
    filename = os.path.basename(f)
    df = pd.read_excel(filename,header=None,sheet_name='Sheet1')
    header_row = df.apply(lambda x: x.first_valid_index()).min()
    df = pd.read_excel(filename, header=header_row,sheet_name='Sheet1')
    count = len(df.index)
    record_counts.append(count)
    print(f"{filename}: {count} records")
    dfs.append(df)

这帮助我确定了第一个非空行

相关问题