Python разбивает значение массивов на разные столбцы

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

     index   source    timestamp    value
      1        car       1         ['98']
      2        bike      2         ['98', 100']
      3        car       3         ['65']
      4        bike      4         ['100', '120']
      5        plane     5         ['20' , '12', '30']

Что мне нужно, так это преобразовать каждое значение внутри серии «значение» Panda .. в новый столбец. Таким образом, результат будет таким:

      index   source    timestamp   car  bike1  bike2  plane1  plane2  plane3
        1      car          1       98    Na     Na     Na       Na     Na
        2      bike         2       Na    98     100    Na       Na     Na
        3      car          3       65    Na     Na     Na       Na     Na
        4      bike         4       Na    100    120    Na       Na     Na
        5      plane        5       Na    Na     Na     20       12     30

Для автомобиля размер массива всегда будет равен единице, для велосипеда 2 и для плоскости 3. И это соответствует количеству новых столбцов, которые мне нужны в новом фрейме данных. Как лучше всего этого добиться?

Что такое print (type(df.loc[1, 'value']))?

jezrael 11.10.2018 13:57

type (df ['value']) возвращает <class 'pandas.core.series.Series'>

Mauricio Rodriguez 11.10.2018 14:00

да, но я спрашиваю об одном значении, а не о столбце. что такое print (type(df.loc[1, 'value']))?

jezrael 11.10.2018 14:00

Виноват. Это возвращает "str"

Mauricio Rodriguez 11.10.2018 14:04

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

quest 11.10.2018 14:06
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
5
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Сначала преобразуйте значения в списки:

import ast
df['value'] = df['value'].apply(ast.literal_eval)

Затем создайте словари для каждой строки:

L = [{f'{i}{x+1}':y for x, y in enumerate(j)} for i, j in zip(df['source'], df['value'])]
print (L)
[{'car1': '98'}, 
 {'bike1': '98', 'bike2': '100'}, 
 {'car1': '65'}, 
 {'bike1': '100', 'bike2': '120'}, 
 {'plane1': '20', 'plane2': '12', 'plane3': '30'}]

Создайте DataFrame и присоединитесь к исходному df:

df = df.join(pd.DataFrame(L, index=df.index))
print (df)
   index source  timestamp         value bike1 bike2 car1 plane1 plane2 plane3
0      1    car          1          [98]   NaN   NaN   98    NaN    NaN    NaN
1      2   bike          2     [98, 100]    98   100  NaN    NaN    NaN    NaN
2      3    car          3          [65]   NaN   NaN   65    NaN    NaN    NaN
3      4   bike          4    [100, 120]   100   120  NaN    NaN    NaN    NaN
4      5  plane          5  [20, 12, 30]   NaN   NaN  NaN     20     12     30

@MauricioRodriguez - Добро пожаловать! И спасибо за комментарий;)

jezrael 11.10.2018 14:18

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