从同一excel工作表上的多个表中创建单独的数据集

2024-04-19 15:45:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个不正常的设置,在同一张excel表格上有多个表格。我试图使每个表(在同一张纸上)成为一个单独的数据框。例如,在一张excel表格上,我可能有:

+--------+--------+--------+--------+--------+--------+-----+
|  Col   |  Col   |  Col   |  Col   |  Col   |  Col   | Col |
+--------+--------+--------+--------+--------+--------+-----+
| Table1 | Table1 |        |        |        |        |     |
|        |        | Table2 | Table2 | Table2 | Table2 |     |
|        | Table3 | Table3 | Table3 |        |        |     |
+--------+--------+--------+--------+--------+--------+-----+

我想要的是按表类型划分的表(下面的示例是一个df中的多个表之一)。每个表的表头开始列都是唯一的, 因此,表1可能会将列标题角列命名为: “导联”, 表2的列标题角列名为: “销售”, 表3的列标题名为: “产品

+--------+--------+--+
| Leads  | Table1 |  |
+--------+--------+--+
| pd.Data| pd.Data|  |
|        |        |  |
|        |        |  |
+--------+--------+--+

+--------+--------+--------+--------+--+
| Sales  | Table2 | Table2 | Table2 |  |
+--------+--------+--------+--------+--+
| pd.Data| pd.Data| pd.Data| pd.Data|  |
|        |        |        |        |  |
|        |        |        |        |  |
+--------+--------+--------+--------+--+

+---------+---------+---------+--+
| Products| Table3  | Table3  |  |
+---------+---------+---------+--+
| pd.Data | pd.Data | pd.Data |  |
|         |         |         |  |
|         |         |         |  |
+---------+---------+---------+--+

因为我知道pandas在假设excel表是一个大表的情况下会做得很好,但是对于多个表,我很难找到将数据划分为单独df的最佳方法,特别是因为随着时间的推移,由于表的长度可变,我无法对行或列进行索引

在我意识到这只适用于一张桌子而不是三张桌子之前,我已经走了这么远:

import pandas as pd
import string
df = pd.read_excel("file.xlsx", usecols="B:I", index_col=3)
print(df)

letter = list(string.ascii_uppercase)

df1 = pd.read_excel("file.xlsx")

def get_start_column(df):
    for i, column in enumerate(df.columns):
        if df[column].first_valid_index():
            return letter[i]

def get_last_column(df):
    columns = df.columns
    len_column = len(columns)
    for i, column in enumerate(columns):
        if df[column].first_valid_index():
            return letter[len_column - i]

def get_first_row(df):
    for index, row in df.iterrows():
        if not row.isnull().values.all():
            return index + 1

def usecols(df):
    start = get_start_column(df)
    end = get_last_column(df)
    return f"{start}:{end}"

df = pd.read_excel("file.xlsx",  usecols=usecols(df1), header=get_first_row(df1)) 
print(df)

Tags: columnsdfdatagetindexdefcolumncol