需要从 Excel(.xlsx) 文件中同一工作表中的多个表中提取数据。每个表的列名上方都有一个不同的标题,并且每个表都以“总计”行结尾(不需要总计行)。目前我需要从此文件中提取 3 个表,但将来还会添加第 4 个表,也需要提取该表。我还有该表的标题和列名。单元格范围不固定,下一个文件中的行可以增加或减少,因此需要动态选取表格。
输出需要是一个大表,其中包含所有 3 个表中的所有不同列以及第 4 个表中的列(当源文件中可用时)。
我正在尝试数据流,但无法提取表格。如果有解决方案,我也愿意在 ADF 或 Synapse 上工作。
示例输入如下所示(所有表格都在同一张表中):
试算表 | ||||
---|---|---|---|---|
帐号 | 原始余额 | 当前余额 | 利率 | 原始日期 |
546172 | 2354673 | 231473 | 10% | 2023年7月3日 |
758682 | 2375764 | 137487 | 9% | 2020年9月9日 |
536357 | 6473635 | 474661 | 13% | 2022年5月11日 |
总计 | 658496 | 784651 |
拖欠报告 | |||
---|---|---|---|
帐号 | 原始余额 | 当前余额 | 下一个截止日期 |
546172 | 2354673 | 231473 | 2024年7月3日 |
536357 | 6473635 | 474661 | 2024年9月9日 |
758682 | 2375764 | 137487 | 11-05-2024 |
总计 | 658496 | 784651 |
您可以使用具有 pandas 功能的 synapse 笔记本来组合所有表格。
下面我给出了 excel 文件中 2 个表格的示例,类似地,您可以更改以下代码以获取更多表格。
df = pd.read_excel("https://vjgsblob.blob.core.windows.net/data/csvs/extracted_data.xlsx?sp=r&st=2024-09-13T07:07:11Z&se=2024-09-13T15:07:11Z&spr=https&sv=2022-11-02&sr=b&sig=2AmroznyDPtH5boSZym8yxpLibsD0X4te18Phj%2BpAxc%3D").dropna(how='all').dropna(axis=1, how='all')
df = df.reset_index(drop=True)
df.columns = [f'col{i}' for i,j in enumerate(df.columns)]
# Getting the column names where table name indicator presents
trialBalancCol = [col for col in df.columns if df[col].str.contains('Trial Balance', na=False).any()][0]
deliquencyReportCol = [col for col in df.columns if df[col].str.contains('Deliquency Report', na=False).any()][0]
# Getting the position, which is used to split them.
trialBalance = df[df[trialBalancCol]=='Trial Balance'].index[0]
deliquencyReport = df[df[deliquencyReportCol]=='Deliquency Report'].index[0]
print(trialBalance,deliquencyReport)
#splitting the tables
dfTrialBalance = df[(df.index>trialBalance) & (df.index<deliquencyReport)].dropna(how='all').dropna(axis=1, how='all')
dfDeliquencyReport = df[df.index>deliquencyReport].dropna(how='all').dropna(axis=1, how='all')
#Removing total row
totalCol = [col for col in dfTrialBalance.columns if dfTrialBalance[col].str.contains('total', na=False).any()][0]
dfTrialBalance = dfTrialBalance[df[totalCol]!='total']
totalCol = [col for col in dfDeliquencyReport.columns if dfDeliquencyReport[col].str.contains('total', na=False).any()][0]
dfDeliquencyReport = dfDeliquencyReport[df[totalCol]!='total']
# Creating the column names
dfTrialBalance.columns = dfTrialBalance.head(1).values.flatten().tolist()
dfDeliquencyReport.columns = dfDeliquencyReport.head(1).values.flatten().tolist()
#Removing the column name row and resetting the index
dfTrialBalance = dfTrialBalance.iloc[1:].reset_index(drop=True)
dfDeliquencyReport = dfDeliquencyReport.iloc[1:].reset_index(drop=True)
#Joining the tables
ResTable = pd.merge(dfTrialBalance,dfDeliquencyReport,on='Acc Number',how='left')
ResTable
执行完上述所有代码后,您可以将其以 csv 格式保存回存储帐户(
ResTable.to_csv(<path>)
)。
再次根据您的数据更改此代码。
输入:
输出:
帐号 | 原创巴尔 | 当前巴尔 | 利率 | 原始日期 | 原始余额 | 当前余额 | 下一个截止日期 | |
---|---|---|---|---|---|---|---|---|
546172 | 2354673 | 231473 | 0.1 | 2023-07-03 00:00:00 | 2354673 | 231473 | 2024-07-03 00:00:00 | |
758682 | 2375764 | 137487 | 0.09 | 2020-09-09 00:00:00 | NaN | NaN | NaN | |
536357 | 6473635 | 474661 | 0.13 | 2022-11-05 00:00:00 | 6473635 | 474661 | 2024-09-09 00:00:00 |