Разбить датафрейм на несколько частей по условию

Рейтинг: 1Ответов: 2Опубликовано: 20.01.2023

Имеется датафрейм, в котором значения в 1 столбце последовательно повторяются и разделены одной, не имеющей значения, строкой

>>> df['a'].values.tolist()
>>> ['количество', 'итог', 'лишнее', 'количество', 'итог']

Количество значений в датафрейме может быть любое, но гарантировано, что есть как минимум 2 повторяющиеся части и одна лишняя строка, которая их разделяет (значение этой строки тоже может быть произвольным).

Как разделить такой датафрейм на несколько частей, при этом чтоб во втором датафрейме повторялись названия столбцов как в первом

Пример для использования

q = [['a', 'b', 'c'], ['количество', 23, 45], ['итог', 100, 120], ['лишнее', 'лишнее', 'лишнее'], ['количество', 35, 87], ['итог', 76, 90]]
qw = pd.DataFrame(q, columns=q[0])
qw = qw[1:]
qw

Нужно получить два датафрейма

[['a', 'b', 'c'], ['количество', 23, 45], ['итог', 100, 120]]

и

[['a', 'b', 'c'], ['количество', 35, 87], ['итог', 76, 90]]

Ответы

▲ 1Принят

я бы рекомендовал поработать с индексами. например, так:

df = df[df["a"]!="лишнее"]
res = [g[1] for g in df.groupby(df.index.to_series().diff().ne(1).cumsum())]

смотрим, что теперь в res:

[print(x, type(x), sep="\n") for x in res]
            a    b    c
0  количество   23   45
1        итог  100  120
<class 'pandas.core.frame.DataFrame'>
            a   b   c
3  количество  35  87
4        итог  76  90
<class 'pandas.core.frame.DataFrame'>

иными словами, если вы специально не меняли индекс фрейма, то он у вас идет от 0 до какого-то числа с инкрементом в 1. удаляем строки с ключевым словом и группируем по последовательно идущим индексам. voilà!

▲ 0

Как-то так чтоли:

import pandas as pd

q = [['a', 'b', 'c'], ['количество', 23, 45], ['итог', 100, 120], ['лишнее', 34, 65], ['количество', 35, 87], ['итог', 76, 90]]
dataframes = []
data = []
check = set()
columns = q[0]
for item in q[1:]:
    if item[0] in check:
        dataframes.append(pd.DataFrame(data=data[:-1], columns=columns))
        data = []
        check = set()
    check.update([item[0]])
    data.append(item)
if data:
    dataframes.append(pd.DataFrame(data=data, columns=columns))
    
dataframes

Вывод:

[            a    b    c
 0  количество   23   45
 1        итог  100  120,
             a   b   c
 0  количество  35  87
 1        итог  76  90]