【问题标题】:how to get value by name from dictionary in python如何从python中的字典中按名称获取值
【发布时间】:2018-03-12 10:39:10
【问题描述】:

我有一个包含公司名称列的 csv 文件,我需要找到它的域名并将其存储在公司名称旁边的同一个 csv 文件中

到目前为止我使用过的代码

import pandas as pd
import clearbit
import json
clearbit.key = 'your secret key'
df = pd.read_csv("/home/vipul/Desktop/new.csv", sep=',', encoding="utf-8")

saved_column = df['Company']
i=0
for data in saved_column:   

    n = saved_column[i]
    i = i+1
    domain = clearbit.NameToDomain.find(name=n)
    print(domain)
    l = json.loads(domain)
    print(l['domain'])

这里的代码给出了 json 中的域名 logo 和名称,但是如何只取域名

但这会产生错误
l = json.loads(domain) print(l['domain'])
错误:
TypeError: the JSON object must be str, not 'NameToDomain'

csv 文件如下所示

Company
‎Accenture
‎AND Digital
‎Accenture
‎Kite Consulting Group
‎Capgemini

预期输出

Company                 Domain
‎Accenture              accenture.com
‎AND Digital            and.digital
‎Accenture              accenture.com
‎Kite Consulting Group  None
‎Capgemini              capgemini.com

json 看起来像

Name: Company, dtype: object
{'name': 'Accenture', 'logo': 'https://logo.clearbit.com/accenture.com', 'domain': 'accenture.com'}
{'name': 'AND Digital', 'logo': 'https://logo.clearbit.com/and.digital', 'domain': 'and.digital'}
{'name': 'Accenture', 'logo': 'https://logo.clearbit.com/accenture.com', 'domain': 'accenture.com'}
None
{'name': 'Capgemini', 'logo': 'https://logo.clearbit.com/capgemini.com', 'domain': 'capgemini.com'}

【问题讨论】:

  • 错误是对的,JSON加载需要一个字符串值。你的看起来已经像字典或对象了。检查类型并相应地提取。
  • 如何获取这个json中域的值?
  • 我没有检查你的代码,但我敢保证clearbit.NameToDomain.find(name=n) 不会返回一个字符串,而是一个NameToDomain 类型的对象。这就是您收到此错误的原因。
  • 您能分享一个示例 csv 文件吗?
  • @Vivek 电子邮件 ID ?

标签: python json pandas csv


【解决方案1】:

根据文档,clearbit.NameToDomain.find(name=n) 返回一个字典,因此您可以像访问任何其他 python 字典一样访问它的值。你不在乎它来自json,它是为你处理的。 (这个问题也与csv无关)。

另外两点:

  • 将您的身份验证密钥发布到 clearbit 可能是个坏主意
  • 在您的 csv 文件中发布人员的姓名和职位也可能是个坏主意,除非您已将所有这些数据都编好。

【讨论】:

  • 你能告诉我如何获得这个域名,我真的很困惑,因为我是新手
  • 你已经有print(domain),这给你什么?那应该是字典。
【解决方案2】:

根据问题,有两点:

  1. 从 clearbit 返回的数据中提取域
  2. 与熊猫合作

  1. Clearbit API 返回一个字典。您可以这样做:

像这样:

data = clearbit.NameToDomain.find(name=n)
print(data) # Dictionary
print(data['domain']) # Domain value
  1. 为了使用 Pandas,您无需循环访问数据

使用应用

import pandas as pd
from urllib.parse import urlparse

def parse_url(x):
    return 'unknown' if pd.isnull(x) else urlparse(x)[1]

df = pd.read_csv("./new.csv")
df['domain'] = df['Profile URL'].apply(parse_url)
df_new = df.loc[:, ['Company', 'domain']]

编辑:

clearbit 的解析器可以像这样实现(我没有尝试过这段代码,但它应该可以工作):

import clearbit
def parse_url(x):
    return 'unknown' if pd.isnull(x)

    data = clearbit.NameToDomain.find(name=x)
    return data.get('domain', 'Default value')

此代码从提供的 CSV 导入数据。您可以改为在 parse_url 方法中调用 clearbit API 并返回适当的值。

此解决方案适用于 Python3。请把它作为一个起点,而不是作为一个复制粘贴的解决方案。

【讨论】:

  • 如果输出中没有,循环停止并抛出不正确的错误
  • 为此,您需要使用df.dropna() 删除空值。或者在apply方法中勾选x.isnull()
  • no i 不能被删除,因为它应该放在 csv 中相应的公司名称旁边!
  • 如果不能删除,可以从apply中使用的方法返回一些默认值。在某个地方,您需要检查isnull()。底线 - 使用 Pandas 时应避免编写循环。这是为了更好的性能。
  • 请您编辑您的代码,以便我可以得到您!
【解决方案3】:

由于它是一个字典,我们可以为其分配一些默认值并存储在 csv 文件中,然后删除它就可以了:)

修改后的代码

import pandas as pd
import clearbit
import json
clearbit.key = 'your key'
df = pd.read_csv("/home/vipul/Desktop/new.csv", sep=',', encoding="utf-8")
saved_column = df['Company'].dropna()
i=0
res = []
for data in saved_column:   
    n = saved_column.get(i)
    print(n)
    i = i+1
    data = clearbit.NameToDomain.find(name=n) 
    if data != None: 
        res.append(data['domain'])
    else:
        res.append('domain.com')
print(res)
df['Domain'] = res
df.to_csv("/home/vipul/Desktop/new.csv",index = False, skipinitialspace=False)

print("File saved to desktop as new.csv")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 2019-12-16
    • 2020-12-18
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多