如何从 pandas 数据框中仅选择几列

asp*_*asp 1 python dataframe pandas

我有一个关于 ansible inventory 的 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)`
Run Code Online (Sandbox Code Playgroud)

它打印整个记录(实际上每个 json 将只有一条记录),但我只需要显示/选择/显示数据框中的两列。有人可以建议如何查看包含选定列的数据框吗

更新 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']]
Run Code Online (Sandbox Code Playgroud)

但是当我提到列作为主机名,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']]
Run Code Online (Sandbox Code Playgroud)

错误:KeyError:“['主机名'] 不在索引中”

更新2:

现在我可以用下面的方法解决这个问题,但我需要在输出中自定义标签,如何做到这一点

`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']]`
Run Code Online (Sandbox Code Playgroud)

但我需要在最终输出中具有自定义列名标签,例如上列的主机、操作系统版本,我该怎么做?

更新 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"
Run Code Online (Sandbox Code Playgroud)

但如果我不重命名,它工作得很好,但我需要最具可读性的列标签。有什么建议请。无需重命名代码即可在控制台上正常工作并输出如下

+----+------------------------+------------------------+
|    | ansible_env.HOSTNAME   | ansible_distribution   |
|----+------------------------+------------------------|
|  0 | ip-xx-xx-xx-xx         | SLES                   |
+----+------------------------+------------------------+
Run Code Online (Sandbox Code Playgroud)

现在改为 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)
Run Code Online (Sandbox Code Playgroud)

小智 8

通过向其传递列表来选择多个列作为 DataFrame:

df[['col_name1', 'col_name2']]
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请尝试此链接: https://medium.com/dunder-data/selecting-subsets-of-data-in-pandas-6fcd0170be9c