Как выбрать только несколько столбцов в панде - PullRequest
0 голосов
/ 28 мая 2019

У меня есть один файл json об инвентаризации, где мне нужно выбрать несколько столбцов в качестве информационного кадра и отправить уведомление по электронной почте.

Ниже приведен код, который я пробовал:

import json
import pandas as pd
from pandas.io.json import json_normalize
with open('d:/facts.json') as f:
    d = json.load(f)
mydata = json_normalize(d['ansible_facts'])
mydata.head(1)`

Его печать полностьюзаписи (на самом деле каждый json будет иметь только одну запись), но мне нужно показать / выбрать / отобразить только два столбца из dataframe.Может кто-нибудь предложить, пожалуйста, как просмотреть фрейм данных с выбранными столбцами

Обновление 1: Я могу генерировать необходимые столбцы сейчас, но работает только определенный столбец, но когда я упоминаю определенные столбцы, тоего высказывание "не в индексе" И также я могу иметь собственный ярлык заголовка собственного столбца во время печати? Работает

import json
import pandas as pd
from pandas.io.json import json_normalize
with open('d:/facts.json') as f:
    d = json.load(f)
mydata = json_normalize(d['ansible_facts'])
mydata.columns = mydata.columns.to_series().apply(lambda x: x.strip())
df1=mydata[['ansible_architecture','ansible_distribution']]

Но когда я упоминаю столбец как имя хоста, ansible_distribution, его высказывание не в индексе. Не работает

import json
import pandas as pd
from pandas.io.json import json_normalize
with open('d:/facts.json') as f:
    d = json.load(f)
mydata = json_normalize(d['ansible_facts'])
mydata.columns = mydata.columns.to_series().apply(lambda x: x.strip())
df1=mydata[['hostname','ansible_distribution']]

Ошибка: KeyError: "['hostname'] не в индексе"

Update2:

Теперь я могуУстранить эту проблему с помощью ниже, но мне нужны пользовательские метки в выходных данных, как это сделать

`import json
import pandas as pd
from pandas.io.json import json_normalize
with open('d:/facts.json') as f:
    d = json.load(f)
mydata = json_normalize(d['ansible_facts'])
mydata.columns = mydata.columns.to_series().apply(lambda x: x.strip())
df1=mydata[['ansible_env.HOSTNAME','ansible_distribution']]`

Но мне нужно иметь настраиваемые метки столбцов в окончательном выводе, такие как Host, OSversion для вышеуказанного столбца, как я могу сделатьчто?

ОБНОВЛЕНИЕ 3 : теперь пытаюсь переименовать имя столбца перед его печатью, пробовал следующий код, но выдавал ошибку, такую ​​как ошибка ключа, а не в индексе

import json
import pandas as pd
from tabulate import tabulate
from pandas.io.json import json_normalize
with open('/home/cloud-user/facts.json') as f:
    d = json.load(f)
mydata = json_normalize(d['ansible_facts'])
mydata.columns = mydata.columns.to_series().apply(lambda x: x.strip())

mydata=mydata.rename(columns={"ansible_env.HOSTNAME": "HOSTNAME", "ansible_disrribution": "OSType"})
df1=mydata[['HOSTNAME','OSType']]
print(tabulate(df1, headers='keys', tablefmt='psql'))

Traceback (most recent call last):
  File "ab7.py", line 21, in <module>
    df1=mydata[['HOSTNAME','OSType']]
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 2682, in __getitem__
    return self._getitem_array(key)
  File "/usr/lib64/python2.7/site-packages/pandas/core/frame.py", line 2726, in _getitem_array
    indexer = self.loc._convert_to_indexer(key, axis=1)
  File "/usr/lib64/python2.7/site-packages/pandas/core/indexing.py", line 1327, in _convert_to_indexer
    .format(mask=objarr[mask]))
KeyError: "['HOSTNAME' 'OSType'] not in index"

Ноесли я не переименую, это работает отлично, но мне нужно наиболее читаемый столбец этикетки.Любое предложение, пожалуйста.без переименования кода вещи получают работу и вывод, как показано ниже на консоли

+----+------------------------+------------------------+
|    | ansible_env.HOSTNAME   | ansible_distribution   |
|----+------------------------+------------------------|
|  0 | ip-xx-xx-xx-xx         | SLES                   |
+----+------------------------+------------------------+

Теперь вместо anisble_env.HOSTNAME -> мне нужно lable в качестве HOSTNAME, а не ansible_distribution -> Мне нужно OSType, любое предложение, пожалуйста

Обновление 4:

Я исправил проблему с ниже

df.rename(columns={'ansible_hostname':'HOSTNAME','ansible_distribution':'OS Version','ansible_ip_addresses':'Private IP','ansible_windows_domain':'FQDN'},inplace=True)

1 Ответ

1 голос
/ 28 мая 2019

Выберите несколько столбцов в качестве DataFrame, передав ему список:

df[['col_name1', 'col_name2']]

Для получения дополнительной информации перейдите по этой ссылке: https://medium.com/dunder-data/selecting-subsets-of-data-in-pandas-6fcd0170be9c

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