Панды получают последовательные строки

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

Я хотел бы разделить фрейм данных из pandas на несколько фреймов данных.

В моем фрейме данных есть столбец с именем ‘C’, в некоторых строках которого содержится 0. Что я надеюсь сделать, так это использовать строки с 0 в качестве разделителя, поэтому я получаю последовательные строки со значениями в столбце ‘C’. Я не думаю, что groupby — это правильный путь, поскольку он принимает строки с одинаковыми значениями, что не совсем то, чего я пытаюсь достичь, если я не использую его вместе с .diff() возможно? Я не уверен. Я чувствую, что сейчас я перепробовал так много вещей, но Python и Pandas — не мой самый сильный язык, поэтому я не уверен, какие есть возможности.

Однако мне удалось заставить его работать, используя мою собственную логику циклов for и операторов if, проходящих через все фреймы вручную, но это медленный процесс, и я надеюсь его улучшить.

Перед:

A C
1 4
2 5
3 0
4 5
5 4
6 5

После:

A C
1 4
2 5
A C
4 5
5 4
6 5

Я использую Python, если это не ясно, любая помощь приветствуется. Большое спасибо.

Ответ №1:

Вы можете создать список фреймов данных:

 #compare for equal 0
m = df['C'].eq(0)
#filter out 0 rows and grouping by cumulative sum of mask
dfs = [x for _, x in df[~m].groupby(m.cumsum())]
print (dfs)
[   A  C
0  1  4
1  2  5,    A  C
3  4  5
4  5  4
5  6  5]

print (dfs[1])
   A  C
3  4  5
4  5  4
5  6  5
 

Комментарии:

1. Не могли бы вы, пожалуйста, объяснить «x для _x» и groupby (m.cumsum)? Правильно ли я понимаю, что последнее работает, только если индекс равен 0,1,2,3 и т.д.?

2. @Pythonistaanonymous — Конечно, это понимание списка, и первые имена групп не важны, поэтому присваиваются _ и извлекаются только DataFrames в переменной x

3. Привет, Израэль, спасибо за ответ! Я довольно ограничен в своих доступных персонажах, поэтому я буду краток. Почему именно мы используем cumsum() для groupby? Насколько я понимаю, cumsum() будет суммировать все значения в строке по мере их прохождения. Итак, как он может использовать это для объединения строк.

4. @user15227672 — Я использую cumsum с маской m = df['C'].eq(0) , вы можете проверить print (m) , и print (m.cumsum()) как создаются группы.

5. Это имеет смысл, да! Я вижу, что он делает сейчас. Только кумулирующие значения всякий раз, когда маска имеет значение True (что означает, что есть ноль), так что, когда C имеет значение, оно остается тем же кумулированным значением, и, таким образом, они будут сгруппированы вместе. Спасибо за ваше время.