如何在从 pandas 读取文件时以编程方式找出 headers 文件的正确 headers?

how to figure out correct headers of an excel file programmatically while reading it from pandas?

我有一个 excel 文件(.xlsx、.xls)的列表,我试图在加载后获取每个文件的 headers。

这里我取了一个 excel 文件并加载到 pandas as.

pd.read_excel("sample.xlsx")

输出为:

在这里,我们希望根据我们的要求获得 header 信息,在附图中,所需的 header 存在于索引 8 处,如您所见,以红色编码显示。

pd.read_excel('sample.xlsx',skiprows=9)

正如我们现在所知,我们在 8 处有一个正确的 header 我可以返回并在 read_excel 中指定为 skip_rows 在 8 以便它从该索引和 headers 将显示为。

如何在我们不知道 header 存在于何处的 excel 文件列表中以编程方式处理此类情况?在这种情况下,我们知道 header 在 8。但是如果我们在其他文件中不知道这一点怎么办。

可以下载示例文件供您参考: https://github.com/myamullaciencia/pg_diploma_ai_ml_uohyd/blob/main/sample_file.xlsx

使用:

df = pd.read_excel('sample_file.xlsx', header = None)
d = df[df[5] == 'Gender'].index[0]
ndf = df[d+1:]
ndf.columns = df.loc[d].values
ndf.reset_index(drop = True)

输出:

请注意,Gender 始终在 headers 中。

根据您的评论,您可以使用以下条件:

df[df.notna().sum(axis = 1)==11].index[0]

使用:

df = pd.read_excel('sample_file.xlsx')

#test all rows if previous row is only NaNs
m1 = df.shift(fill_value=0).isna().all(axis=1)
#test all rows if no NaNs
m2 = df.notna().all(axis=1)
#chain together and filter all next rows after first match
df = df[(m1 & m2).cummax()]

#set first row to columns names
df = df.set_axis(df.iloc[0].rename(None), axis=1).iloc[1:].reset_index(drop=True)

print (df)
   LN  FN          SSN        DOB        DOH Gender  Comp_2011 Comp_2010  \
0  Ax  Bx  000-00-0000   8/3/1800   1/1/1800   Male  384025.56    396317   
1  Er  Ds  000-00-0000   5/7/1800   7/1/1800   Male  382263.86    392474   
2  Po  Ch  000-00-0000   9/9/1800   1/1/1800   Male  406799.34    395677   
3  Rt  Da  000-00-0000  6/24/1800   7/1/1800   Male  395767.12    424093   
4  Yh  St  000-00-0000  3/15/1800   7/1/1800   Male  376936.58    373754   
5  Ws  Ra  000-00-0000  6/12/1800  7/10/1800   Male  425720.06    420927   

  Comp_2009 Allocation Group                  NRD  
0    360000             0.05  2022-09-01 00:00:00  
1    360000             0.05  2015-06-01 00:00:00  
2    360000             0.05  2013-01-01 00:00:00  
3    360000             0.05  2020-07-01 00:00:00  
4    360000                0  2013-01-01 00:00:00  
5    306960                0  2034-07-01 00:00:00