python - 如何从熊猫数据框中只选择几列
问题描述
我有一个关于 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'] 不在索引中”
更新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']]`
但是我需要在最终输出中自定义列名标签,例如上述列的主机、操作系统版本,我该怎么做?
更新 3:现在尝试在打印之前重命名列名,尝试以下代码但给出错误,如 key error not in index
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)
解决方案
通过将列表传递给它来选择多个列作为 DataFrame:
df[['col_name1', 'col_name2']]
有关更多信息,请尝试此链接: https ://medium.com/dunder-data/selecting-subsets-of-data-in-pandas-6fcd0170be9c