Развернуть столбцы Pandas со списками

У меня есть фрейм данных с одной строкой, которая выглядит следующим образом:

a   b   c   d   e
1   [2,4]   [2,7]   apple   orange

Я знаю, как это сделать с одним столбцом списка, но не был уверен, как это изменится с несколькими столбцами списка. По сути, я хочу расширить фрейм данных на n строк в зависимости от того, сколько элементов в каждом списке. Число всегда является эквивалентом между столбцами со списками. Таким образом, приведенный выше пример станет следующим:

a   b   c   d   e
1   2   2   apple   orange
1   4   7   apple   orange
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
183
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Забавно, как простая проблема может быть сложной:

(pd.DataFrame(df.loc[0,['b','c']].to_list(), columns=['b','c'])
   .join(df.loc[df.index.repeat(len(df.loc[0,'b'])),['a','d','e']].reset_index(drop=True))
)

Забавно, как это работает. Я думал о том, чтобы сделать что-то подобное, но я подумал, что будет метод pandas, похожий на «взрыв», о котором я не знал. Спасибо чувак!

ben890 18.12.2020 21:08

Альтернативный способ использования explode для получения решения:

ndf = pd.concat([df.explode('c').drop('b', axis=1), df.explode('b').drop('c', axis=1)], axis=1)

ndf.loc[:,~ndf.columns.duplicated()]

Я не уверен, что это решение сработает для вашего реального dataframe. Мне кажется, что это работает только из-за простых данных примера.

import pandas as pd
import io

t = '''
a   b   c   d   e
1   [2,4,5]   [2,7,2]   apple   orange'''

# Setting up the dataframe with lists in `b` and `c`.
df = pd.read_csv(io.StringIO(t), sep='\s+', converters = {'b': eval, 'c': eval})

df.apply(pd.Series.explode)

Вне:

   a  b  c      d       e
0  1  2  2  apple  orange
0  1  4  7  apple  orange
0  1  5  2  apple  orange

Если ваши списки имеют одинаковую длину, вы можете использовать конструктор pandas dataframe со словарем:

import pandas as pd

data = pd.Series([1, [2,4], [2,7], 'apple', 'orange'],
                  index=['a','b','c','d','e'])
data = pd.DataFrame(data).T
print(data, '\n\n')

output = pd.DataFrame(dict(zip(data.columns, data.loc[0])))
print(output)
   a       b       c      d       e
0  1  [2, 4]  [2, 7]  apple  orange


   a  b  c      d       e
0  1  2  2  apple  orange
1  1  4  7  apple  orange

Другие вопросы по теме