#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 имеет значение, оно остается тем же кумулированным значением, и, таким образом, они будут сгруппированы вместе. Спасибо за ваше время.