Windows обрабатывает XML-файл для панд данных? - PullRequest
0 голосов
/ 14 октября 2019

Я хотел бы преобразовать результаты следующей команды Windows в фрейм данных pandas.

С помощью этой команды генерируются необработанные данные на машине Windows

wmic process get Caption,Processid, ParentProcessId, CommandLine, CreationDate, KernelModeTime, UserModeTime, ThreadCount, HandleCount, WorkingSetSize, PeakWorkingSetSize, VirtualSize, PeakVirtualSize, PageFaults, PageFileUsage, PeakPageFile *sage 100, ReadOperationCount7следующий код

with f.open("RunningProcess.xml") as praw:

etree = et.parse(praw)
xroot = etree.getroot()
nprop = []

for property in xroot.iter("PROPERTY"):
    xnames = property.get("NAME")
    nprop.append(xnames)

npropf = pandas.DataFrame(index=nprop)
rprows = []
data = []
inner = {}

for child in xroot.iter("PROPERTY"):
    for gchild in child.iterfind('VALUE'):
        inner[gchild.tag] = gchild.text
    data.append(inner)
    rprows.append(pandas.DataFrame(data))
    data = []; inner = {}

finaldf = pandas.concat(rprows, sort=False).reset_index(drop=True)


finaldf.index = nprop


rpdfhtml = finaldf.to_html(index=True, header=True, border=1)

Я получаю этот результат

первые 39 строк вывода

Я хотел бы

  • сделать первые 20 строк индекса столбцами (подпись к WriteOperationCount)
  • вместо этого сделать столбцы значений в виде строк.

как в этом примере первые 9 столбцов желаемого вывода

1 Ответ

1 голос
/ 15 октября 2019

Добро пожаловать! Это был интересный вопрос. Это не идеально, но, надеюсь, это поможет

Я хотел попытаться избежать жесткого кодирования любых интересующих столбцов.

Допущения - Этот файл будет иметь предсказуемый шаблон имен полей.

Я использовал xml.etree.ElementTree, я нахожу это в прямой библиотеке

import xml.etree.ElementTree as ET

ссылка на XML-файл

file = '/location/to/file/RunningProcess.xml'

Создание плоского DataFrame. Я лично считаю, что это легче разобрать, чем работать полностью в XML, потянув XML

Сначала создайте плоский список

tree = ET.parse(file)
root = tree.getroot()

ls_processes = []

for COMMAND in root.iter('COMMAND'):
    for RESULTS in COMMAND.iter('RESULTS'):
        for PROPERTY in RESULTS.iter('PROPERTY'):

            VALUE = PROPERTY.find('VALUE') 

            if VALUE is not None:
                print(PROPERTY.attrib['NAME'],'|',PROPERTY.attrib['TYPE'],'|', VALUE.text )
                ls_processes.append([PROPERTY.attrib['NAME'],PROPERTY.attrib['TYPE'], VALUE.text])
            else:
                print(PROPERTY.attrib['NAME'],'|',PROPERTY.attrib['TYPE'],'|', "NO VALUE")
                ls_processes.append([PROPERTY.attrib['NAME'],PROPERTY.attrib['TYPE'], 'NO VALUE'])

Это создаст нечто, похожее на это

Caption | string | System Idle Process
CommandLine | string | NO VALUE
CreationDate | datetime | 20191002111400.978894+060
HandleCount | uint32 | 0
KernelModeTime | uint64 | 159488690156250
OtherOperationCount | uint64 | 0 

Преобразование в фрейм данных

df_processes = pd.DataFrame(ls_processes)

Переименование столбцов, чтобы упростить работу с фреймом данных

df_processes.columns = ['data','type','value']

Создание списка интересующих столбцов

ls_columns = ['Caption', 'ProcessId', 'ParentProcessId', 'CommandLine', 'CreationDate', 'KernelModeTime', 'UserModeTime', 'ThreadCount', 'HandleCount', 'WorkingSetSize', 'PeakWorkingSetSize', 'VirtualSize', 'PeakVirtualSize', 'PageFaults', 'PageFileUsage', 'PeakPageFileUsage', 'ReadOperationCount', 'WriteOperationCount', 'OtherOperationCount']

Создание столбцов Dataframe для каждого интересующего столбца

ls_processes = []
for column in ls_columns:
    print(column)
    ls_row = []
    for index, row in df_processes.iterrows():
        if row['data'] == column: 
            ls_row.append(row['value'])

    df = pd.DataFrame(ls_row)
    ls_processes.append(df)

Конкатизация Dataframes вместе по столбцам

df_processes_flat = pd.concat(ls_processes, axis = 1 ) 

Добавление имен столбцов с использованием ранее созданного списка

df_processes_flat.columns = ls_columns

В итоге вы получите Dataframe, который выглядит следующим образомэлегантно но, надеюсь, понятно, что происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...