У меня неправильная настройка, когда у меня несколько таблиц на одном листе Excel. Я пытаюсь сделать каждую таблицу (на одном листе) отдельным pandas фреймом данных. Например, на одном листе Excel у меня может быть:
+--------+--------+--------+--------+--------+--------+-----+
| Col | Col | Col | Col | Col | Col | Col |
+--------+--------+--------+--------+--------+--------+-----+
| Table1 | Table1 | | | | | |
| | | Table2 | Table2 | Table2 | Table2 | |
| | Table3 | Table3 | Table3 | | | |
+--------+--------+--------+--------+--------+--------+-----+
И что мне нужно, так это таблицы, разбитые по типу таблицы (пример ниже - одна из нескольких таблиц в pandas df). Начальный столбец заголовка таблицы уникален для каждой таблицы, поэтому table1 может иметь угловой столбец заголовка столбца с именем: " Leads ", table2 имеет угловой столбец заголовка столбца с именем: " Sales " , а table3 имеет заголовок столбца с именем: " Products ".
+--------+--------+--+
| 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)