首页 > 解决方案 > 如何从熊猫数据框中只选择几列

问题描述

我有一个关于 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)

标签: pythonpandasdataframe

解决方案


通过将列表传递给它来选择多个列作为 DataFrame:

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

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


推荐阅读