Чтение листа excel с накопленным заголовком с использованием Python

У меня есть лист Excel, где заголовки (TradeDate, Value) расположены друг над другом, разделенные типом (ABS, MBS), пример формата:

ABS,
TradeDate,Value
2019-01-21,21
2019-01-22,22
MBS,
TradeDate,Value
2019-01-21,11
2019-01-22,12
2019-01-23,13

Как я могу загрузить это в python, желательно pandas или другой пакет, где я загружаю каждый заголовок отдельно? Заголовки уникальны/одинаковы для каждого типа, а индекс заголовков может меняться. Используя приведенный выше пример, я хотел бы вернуть два отдельных фрейма данных или объектов.

df_abs

TradeDate,Value
2019-01-21,21
2019-01-22,22

и df_mbs

TradeDate,Value
2019-01-21,11
2019-01-22,12
2019-01-23,13
Не добавляйте данные/код в виде картинки. Мы не можем скопировать это, чтобы воспроизвести хороший ответ.
Erfan 27.05.2019 17:39

@Erfan Извините, я добавлю таблицу / что-то, что можно скопировать и вставить, stackoverflow сделал это за меня, когда я копировал и вставлял из Excel.

pyCthon 27.05.2019 17:41

@Erfan обновлен примерами с возможностью копирования и вставки, imgur не должен быть функцией, когда вы копируете и вставляете из Excel на SO.

pyCthon 27.05.2019 17:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может быть немного чрезмерным, но не смог найти более простого решения:

# Mask all the rows which have a date
m = df[0].str.match('([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))')

# Create an equal indicator on each row which has a date, but stops when value changes so we can groupby
df['ind'] = np.where(~m, 0, (m != m.shift(1)).astype(int).cumsum())

# Extract seperate dataframe into a list
dfs = [d for _, d in df[df.ind.ne(0)].groupby('ind')]

# Rename columns to expected output
dfs = [df.reset_index(drop=True).rename(columns = {0:'TradeDate', 1:'Value'}) for df in dfs]

Выход

for d in dfs:
    print(d,'\n')

    TradeDate Value  ind
0  2019-01-21    21    2
1  2019-01-22    22    2 

    TradeDate Value  ind
0  2019-01-21    11    4
1  2019-01-22    12    4
2  2019-01-23    13    4 

Воспроизводимый пример

from io import StringIO

a = StringIO('''
ABS,
TradeDate,Value
2019-01-21,21
2019-01-22,22
MBS,
TradeDate,Value
2019-01-21,11
2019-01-22,12
2019-01-23,13
''')

df = pd.read_csv(a, header=None)

# Out
            0      1
0         ABS    NaN
1   TradeDate  Value
2  2019-01-21     21
3  2019-01-22     22
4         MBS    NaN
5   TradeDate  Value
6  2019-01-21     11
7  2019-01-22     12
8  2019-01-23     13

Это хорошее решение, если заголовок более сложный, это может быть немного сложно с регулярным выражением, но все равно должно работать.

pyCthon 27.05.2019 18:53

Я понимаю, о чем вы говорите, это трудно обобщить для сценария Любые. @pyCthon, но этого достаточно, чтобы ваш вопрос был сформулирован как есть.

Erfan 27.05.2019 19:31

Другие вопросы по теме