Мое решение позволяет разбить ваш DataFrame на любое количество фрагментов в каждой строке, заполненной NaN s.
Предположим, что входной DataFrame содержит:
A B C
0 10.0 Abc 20.0
1 11.0 NaN 21.0
2 12.0 Ghi NaN
3 NaN NaN NaN
4 NaN Hkx 30.0
5 21.0 Jkl 32.0
6 22.0 Mno 33.0
7 NaN NaN NaN
8 30.0 Pqr 40.0
9 NaN Stu NaN
10 32.0 Vwx 44.0
, чтобы «точки разделения» были строками с индексами 3 и 7 .
Для выполнения вашей задачи:
Создать критерий группировки Ряд :
grp = (df.isnull().sum(axis=1) == df.shape[1]).cumsum()
Отбросить строки, заполненные NaN , и сгруппировать результат по приведенный выше критерий:
gr = df.dropna(axis=0, thresh=1).groupby(grp)
thresh=1
означает, что для текущей строки достаточно иметь 1 не- NaN значение, которое будет сохранено в результате .
Выполните фактическое разбиение, как понимание списка:
result = [ gr.get_group(key) for key in gr.groups ]
Чтобы распечатать результат, вы можете запустить:
for i, chunk in enumerate(result):
print(f'Chunk {i}:')
print(chunk, end='\n\n')
получение:
Chunk 0:
A B C
0 10.0 Abc 20.0
1 11.0 NaN 21.0
2 12.0 Ghi NaN
Chunk 1:
A B C
4 NaN Hkx 30.0
5 21.0 Jkl 32.0
6 22.0 Mno 33.0
Chunk 2:
A B C
8 30.0 Pqr 40.0
9 NaN Stu NaN
10 32.0 Vwx 44.0