Разбить датафрейм на несколько частей по условию
Имеется датафрейм, в котором значения в 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]]
Ответы (2 шт):
Как-то так чтоли:
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]
я бы рекомендовал поработать с индексами. например, так:
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à!