У меня есть следующий DataFrame, в котором один из столбцов является объектом (ячейка типа списка):
df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]})
df
Out[458]:
A B
0 1 [1, 2]
1 2 [1, 2]
Мой ожидаемый результат:
A B
0 1 1
1 1 2
3 2 1
4 2 2
Что мне делать для этого?
Связанный вопрос
pandas: когда содержимое ячейки является списком, создайте строку для каждого элемента в списке
Хороший вопрос и ответ, но обрабатывайте только один столбец со списком (в моем ответе функция самоопределения будет работать для нескольких столбцов, также принятый ответ использует больше всего времени apply
, что не рекомендуется, проверьте дополнительную информацию Когда мне когда-либо понадобится использовать pandas apply () в моем коде? )
Ответы:
Я знаю, что
object
столбцыtype
затрудняют преобразование данных с помощьюpandas
функции. Когда я получил такие данные, первое, что пришло в голову, было «сгладить» или разложить столбцы.Я использую
pandas
иpython
функцию для этого типа вопроса. Если вас беспокоит скорость вышеперечисленных решений, проверьте ответ user3483203 , поскольку он используетnumpy
и большую часть времениnumpy
работает быстрее. Рекомендую,Cpython
иnumba
если скорость имеет значение.Метод 0 [pandas> = 0.25]
Начиная с pandas 0.25 , если вам нужно взорвать только один столбец, вы можете использовать
pandas.DataFrame.explode
функцию:Учитывая фрейм данных с пустым
list
или aNaN
в столбце. Пустой список не вызовет проблемы, но егоNaN
необходимо заполнитьlist
Метод 1
apply + pd.Series
(простой для понимания, но с точки зрения производительности не рекомендуется).Метод 2
Используя
repeat
сDataFrame
конструктором, воссоздайте фрейм данных (хорошо для производительности, не подходит для нескольких столбцов)Например, метод 2.1 помимо A у нас есть A.1 ..... An Если мы все еще используем метод ( метод 2 ), описанный выше, нам будет трудно воссоздавать столбцы один за другим.
Решение:
join
илиmerge
сindex
последующим "разложением" отдельных столбцовЕсли вам нужен такой же порядок столбцов, как и раньше, добавьте
reindex
в конце.Метод 3
воссоздайте
list
Если более двух столбцов, используйте
Метод 4
с использованием
reindex
илиloc
Метод 5,
когда список содержит только уникальные значения:
Метод 6
с использованием
numpy
для высокой производительности:Метод 7
с использованием базовой функции
itertools
cycle
иchain
: чистое решение на Python просто для удовольствияОбобщение на несколько столбцов
Функция самоопределения:
Развертывание по столбцам
Все вышеперечисленные методы говорят о вертикальном разложении и разнесении. Если вам нужно развернуть список по горизонтали , проверьте с помощью
pd.DataFrame
конструктораОбновленная функция
Тестовый выход
источник
Опция 1
Если все подсписки в другом столбце имеют одинаковую длину, здесь
numpy
может быть эффективным вариантом:Вариант 2
Если подсписки имеют разную длину, вам понадобится дополнительный шаг:
Вариант 3
Я попытался обобщить это, чтобы сгладить
N
столбцы иM
столбцы плиток , позже я поработаю над тем, чтобы сделать его более эффективным:Функции
Сроки
Производительность
источник
df.explode
методом.Разнесение столбца в виде списка было значительно упрощено в pandas 0.25 с добавлением
explode()
метода:Вне:
источник
Одна альтернатива - применить рецепт сетки к строкам столбцов, чтобы разложить их:
Вывод
источник
Мои 5 центов:
и еще 5
оба приводят к одному и тому же
источник
Настройка проблемы
Предположим, что в нем есть несколько столбцов с объектами разной длины.
Когда длина одинакова, нам легко предположить, что различные элементы совпадают и должны быть соединены вместе.
Однако это предположение подвергается сомнению, когда мы видим объекты разной длины, должны ли мы «застегнуть», и если да, то как нам справиться с избытком в одном из объектов. ИЛИ , может быть, нам нужен продукт всех объектов. Это быстро станет большим, но, возможно, это именно то, что нужно.
ИЛИ
Функция
Эта функция изящно обрабатывает
zip
илиproduct
на основе параметра и предполагает, что вzip
соответствии с длиной самого длинного объекта сzip_longest
На молнии
Товар
Новая установка
Немного изменяя пример
На молнии
Товар
источник
Потому что обычно длина подсписок различается, а объединение / слияние требует гораздо больших вычислительных затрат. Я повторно протестировал метод для подсписка разной длины и более обычных столбцов.
MultiIndex также должен быть более простым способом написания и иметь примерно те же характеристики, что и numpy way.
Удивительно, но в моем понимании реализации способ имеет лучшую производительность.
Производительность
Относительное время каждого метода
источник
Я немного обобщил проблему, чтобы ее можно было применить к большему количеству столбцов.
Краткое изложение того, что делает мое решение:
Полный пример:
Фактический взрыв выполняется в 3 строки. Остальное - косметика (взрыв из нескольких столбцов, обработка строк вместо списков в столбце разнесения, ...).
Кредиты ответу WeNYoBen
источник
Кое-что не рекомендуется (по крайней мере, работать в этом случае):
concat
+sort_index
+iter
+apply
+next
.Сейчас:
Является:
Если заботиться об индексе:
Сейчас:
Является:
источник
Какие мнения по поводу этого метода я придумал? или одновременное выполнение операций concat и melt считается слишком "дорогостоящим"?
источник
У меня есть еще один хороший способ решить эту проблему, когда нужно взорвать более одного столбца.
Я хочу взорвать столбцы B и C. Сначала я взорву B, затем C. Затем я отбрасываю B и C из исходного df. После этого я сделаю индексное соединение для 3 файлов dfs.
источник
источник
источник
В моем случае с более чем одним столбцом для разнесения и с переменными длинами массивов, которые необходимо удалить.
В итоге я применил новые панды 0.25
explode
функцию два раза, затем удалил сгенерированные дубликаты, и она сделала свою работу!источник