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

时间:2019-05-28 16:55:15

标签: python pandas dataframe

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

1 个答案:

答案 0 :(得分:1)

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

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

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