读取excel文件与多个标题在不同的行位置,以Pandasdataframe

wfveoks0  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一些Excel文件与此配置。
Excel sheet that needs to be written to a pandas dataframe
也就是说,代替将标题3/标题31写入列D,将标题4/标题41写入列E,并且将标题5/标题51写入列F,用户以图中所示的方式写入。请注意,所有变量(标题)的用户都是相同的,下一批标题之间有一个空格。有没有办法把这个文件读成pandas Dataframe ?我不能只是手动更正excel文件,然后在Python中读取,因为有许多文件和许多列。
Intended way of the dataframe to be shown in a pandas dataframe
我一直在通过Stack Overflow做研究,试图找到答案,我发现了一些有趣的类似问题,但不完全是我需要做的。
Link 1这一个在整个工作表中有不同的header,但是OP只需要dataframe的特定部分。接受的答案使用open(file)并读取文件,直到找到正确的头。我考虑过这样做,但是我如何才能停止逐列阅读,因为我需要所有列,而不仅仅是一列,然后传递给read_excel
Link2这一个也是类似的,但OP需要不包括数据后,'中断'发生。也就是说,当出现分隔其他标题的空行时,循环结束,结果转到read_excel
我认为要走的路将是通过文件阅读与open,而不是直接去read_excel,但如何读取列的列?
谢谢你!

qhhrdooz

qhhrdooz1#

你可以试试这个:

#https://stackoverflow.com/a/75922169/16120011
import numpy as np
import pandas as pd

#pip install scikit-image
from skimage.measure import label, regionprops

df = pd.read_excel("file.xlsx", header=None)

larr = label(np.array(df.notnull()).astype("int"))

list_dfs = []
for s in regionprops(larr):
    sub_df = (df.iloc[s.bbox[0]:s.bbox[2], s.bbox[1]:s.bbox[3]].set_index(0)
                .pipe(lambda df_: df_.set_axis(pd.MultiIndex.from_frame(
                    df_.iloc[0:2].T, names=[None]*2), axis=1)
                .drop(df_.index[:2])
                     )
             )
    list_dfs.append(sub_df)

out = pd.concat(list_dfs, axis=1).rename_axis(index=None)

输出:

print(out)

       Header1  Header2  Header3  Header4  Header5
      Header12 Header21 Header31 Header41 Header51
user1        1        2       11       12        3
user2        3        4       13       14        4
user3        5        6       10        7        1
user4        7        8        1        2        2
user5        9       10        4        5        3

如果你不想要一个 MultiIndex,只关心输出格式,你可以用途:

list_dfs = []
for s in regionprops(larr):
    sub_df = df.iloc[s.bbox[0]:s.bbox[2], s.bbox[1]:s.bbox[3]].set_index(0)
    list_dfs.append(sub_df)

out = pd.concat(list_dfs, axis=1).rename_axis(index=None).reset_index()

out.to_excel("outfile.xlsx", header=False, index=False)

输出:

  • 使用的电子表格:*

相关问题