我有一个有关ansible广告资源的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将只有一个记录),但是我只需要显示/选择/显示数据框中的两列。有人可以建议如何查看带有选定列的数据框吗?
更新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)的最终输出中具有自定义columname标签,该怎么做?
更新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->我需要将标签命名为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)
答案 0 :(得分:1)
通过向其传递列表来选择多个列作为DataFrame:
df[['col_name1', 'col_name2']]
有关更多信息,请尝试以下链接: https://medium.com/dunder-data/selecting-subsets-of-data-in-pandas-6fcd0170be9c