Разверните столбец данных для многих

Я прочитал несколько сообщений, но я не смог получить то, что хочу. У меня есть фрейм данных с ~ 4 тыс. строк и несколькими столбцами, которые я экспортировал из Infoblox (DNS-сервер). Одним из них являются атрибуты dhcp, и я хотел бы расширить его, чтобы иметь отдельные значения. Это мой df (прилагаю скриншот из excel): скриншот в эксель

Один из столбцов представляет собой словарь из всех вариантов, это пример (очищенный):

[
    {"name": "tftp-server-name", "num": 66, "value": "10.70.0.27", "vendor_class": "DHCP"},
    {"name": "bootfile-name", "num": 67, "value": "pxelinux.0", "vendor_class": "DHCP"},
    {"name": "dhcp-lease-time", "num": 51, "use_option": False, "value": "21600", "vendor_class": "DHCP"},
    {"name": "domain-name-servers", "num": 6, "use_option": False, "value": "10.71.73.143,10.71.74.163", "vendor_class": "DHCP"},
    {"name": "domain-name", "num": 15, "use_option": False, "value": "example.com", "vendor_class": "DHCP"},
    {"name": "routers", "num": 3, "use_option": True, "value": "10.70.1.200", "vendor_class": "DHCP"},
]

Я хотел бы расширить этот столбец до некоторого (в ту же строку), например. Использование «имя» в качестве столбца df и «значение» в качестве значения строки. Это будет целью:

      tftp-server-name         voip-tftp-server                  dhcp-lease-time        domain-name-server        domain-name        routers
0      10.71.69.58              10.71.69.58,10.71.69.59           86400           10.71.73.143,10.71.74.163       example.com      10.70.12.254

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

Большое спасибо за ваше решение (обоим). Я мог заставить его работать, это мой последний файл: Я мог бы это сделать. Я добавляю полное решение на всякий случай, если оно кому-то понадобится (может быть, есть более питонический способ, но он работает):

def formato(df):

    opciones = df['options']
    df_int = pd.DataFrame()
    for i in opciones:
        df_int = df_int.append(pd.DataFrame(i).set_index("name")[["value"]].T.reset_index(drop=True))
    df_int.index = range(len(df_int.index))
    df_global = pd.merge(df, df_int, left_index=True, right_index=True, how = "inner")
    df_global = df.rename(columns = {"comment": "Comentario", "end_addr": "IP Fin", "network": "Red",
                    "start_addr": "IP Inicio", "disable": "Deshabilitado"})
    df_global = df_global[["Red", "Comentario", "IP Inicio", "IP Fin", "dhcp-lease-time",
            "domain-name-servers", "domain-name", "routers", "tftp-server-name", "bootfile-name",
            "voip-tftp-server", "wdm-server-ip-address", "ftp-file-server", "vendor-encapsulated-options"]]
    return df_global
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вот одно из решений:

import pandas as pd
data = [{'name': 'tftp-server-name', 'num': 66, 'value': '10.70.0.27', 'vendor_class': 'DHCP'}, {'name': 'bootfile-name', 'num': 67, 'value': 'pxelinux.0', 'vendor_class': 'DHCP'}, {'name': 'dhcp-lease-time', 'num': 51, 'use_option': False, 'value': '21600', 'vendor_class': 'DHCP'}, {'name': 'domain-name-servers', 'num': 6, 'use_option': False, 'value': '10.71.73.143,10.71.74.163', 'vendor_class': 'DHCP'}, {'name': 'domain-name', 'num': 15, 'use_option': False, 'value': 'example.com', 'vendor_class': 'DHCP'}, {'name': 'routers', 'num': 3, 'use_option': True, 'value': '10.70.1.200', 'vendor_class': 'DHCP'}]

df = pd.DataFrame(data).set_index("name")[["value"]].T.reset_index(drop=True)    

Выход:

name tftp-server-name bootfile-name dhcp-lease-time        domain-name-servers  domain-name      routers
0          10.70.0.27    pxelinux.0           21600  10.71.73.143,10.71.74.163  example.com  10.70.1.200

Здравствуйте, @anon01, спасибо за ответ, но я не смог поставить цель. Я хочу преобразовать все серии панд, но когда я их прочитал, я получаю их как «str», и я не могу создать новый фрейм данных.

pablo juarez 21.12.2020 10:23

Я пробую небольшой пример: opciones = df.loc[0:5, 'options'] for i in opciones: print(type(i)) --> <class 'str'>

pablo juarez 21.12.2020 10:28

Как правильно читать df['options'], чтобы получить эти списки, чтобы я мог преобразовать их, как вы сказали?

pablo juarez 21.12.2020 10:29

Вы можете использовать json_normalize следующим образом:

from pandas.io.json import json_normalize
import ast
import pandas as pd


def extract_dict(ld):
    res  = {}
    for d in ast.literal_eval(ld):
        res[d['name']] = d['value']
    return res

# load dataframe (I made a dummy, replace it with read from file)
df = pd.DataFrame.from_dict({'temp':['temp'],'option':['''[{'name': 'tftp-server-name', 'num': 66, 'value': '10.70.0.27', 'vendor_class': 'DHCP'}, {'name': 'bootfile-name', 'num': 67, 'value': 'pxelinux.0', 'vendor_class': 'DHCP'}, {'name': 'dhcp-lease-time', 'num': 51, 'use_option': False, 'value': '21600', 'vendor_class': 'DHCP'}, {'name': 'domain-name-servers', 'num': 6, 'use_option': False, 'value': '10.71.73.143,10.71.74.163', 'vendor_class': 'DHCP'}, {'name': 'domain-name', 'num': 15, 'use_option': False, 'value': 'example.com', 'vendor_class': 'DHCP'}, {'name': 'routers', 'num': 3, 'use_option': True, 'value': '10.70.1.200', 'vendor_class': 'DHCP'}]''']})

B = json_normalize(df['option'].apply(extract_dict).tolist())
print(B)

Вывод выглядит следующим образом:

  tftp-server-name bootfile-name dhcp-lease-time        domain-name-servers  domain-name      routers
0       10.70.0.27    pxelinux.0           21600  10.71.73.143,10.71.74.163  example.com  10.70.1.200

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