【问题标题】:Converting pandas DataFrame rows a JSON schema and then making a POST Request将 pandas DataFrame 行转换为 JSON 模式,然后发出 POST 请求
【发布时间】:2017-12-18 20:32:10
【问题描述】:

我有一个 JSON 格式的数据集,如下所示:

>>> finalJSON
'"company": {"name": "Micro inc.", "founders": {"name": "Jim D", "name": "Susan A"}, 
 "company": {"name": "Vitacore", "founders": {"name": "Billy B", "name": "Sally Q", "name": "Mark G"}'
.....

我需要遍历并发送以下各项:

'"company": {"name": "Micro inc.", "founders": {"name": "Jim D", "name": "Susan A"},

到这样的 POST 请求:

d = []
for company in FinalJSON:
    p = requests.post((url + '/ratio'), json=company, headers=headers)
    if(p.status_code == 200):
            print p.text
            d.append(p.text)
    else:
            print(p.status_code)
            print "Error"

编辑/更新

希望这是我正在尝试做的更完整的示例。我有一个 Pandas DataFrame,其中包含这样的公司名称和员工:

>>> print name_frame
... 
               name    name    name    name        name
Micro inc.      NaN    Jim D  Susan A      NaN       NaN
Vitacore    Billy B      NaN  Sally Q   Mark G       NaN

我需要做的就是将它转换成这样的 JSON 格式:

finalJSON = { 
    "company":{
        "name": "Micro inc.",
        "founders": {
            "name": "Jim D",
            "name": "Susan A",
            }
    }
    "company":{
        "name": "Vitacore",
        "founders": {
            "name": "Billy B",
            "name": "Sall Q", 
            "name":"Mark G",
        }

previous question 中,有人建议我尝试一下以获得所需的 JSON 格式:

finalJSON = []
for company, names in df.iterrows():
    names = ['"{0}"'.format(name) for name in names.dropna().tolist()]
    names_json_str = ('"name": ' if names else '') + ', "name": '.join(names)
    finalJSON.append('"company": {"name": "' + company + '", "founders": {' + names_json_str + '}')
finalJSON = ', '.join(finalJSON)

>>> finalJSON
'"company": {"name": "Micro inc.", "founders": {"name": "Jim D", "name": "Susan A"}, 
 "company": {"name": "Vitacore", "founders": {"name": "Billy B", "name": "Sally Q", "name": "Mark G"}'

所以现在我正在将转换与发布请求集成:

for company, names in name_frame.iterrows():
    names = ['"{0}"'.format(name) for name in names.dropna().tolist()]
    names_json_str = ('"name": ' if names else '') + ', "name": '.join(names)
    payload = '"company": {"name": "' + company + '", "founders": {' + names_json_str + '}'
    p = requests.post((url), json=payload, headers=headers)
    if(p.status_code == 200):
            print p.text
            d.append(p.text)
    else:
            print(p.status_code)
            print "Error"

虽然payload实际上不被认为是JSON可序列化的

TypeError: set([' + names_json_str + ']) is not JSON serializable

【问题讨论】:

  • finalJSON 实际上不是有效的 JSON 值。此外,作为一个字符串,company 一次只分配给该字符串中的一个字符。
  • @chepner 这是因为重复的键吗?这是有效的 JSON 格式,虽然很奇怪。您对如何选择我指定的项目有任何想法吗?
  • 你需要改变构造finalJSON的方式。您可能需要一个字符串列表,每个字符串包含 1 家公司的 JSON 数据。请注意,目前每个公司条目都缺少右大括号。
  • @PM2Ring 的格式是否正确:{"company": {"name": "A company", "founders": {"name": "Joe"}}}
  • 是的,看起来不错。但是看看你问题中的其他内容,在像{"name": "Jim D", "name": "Susan A"} 这样的 JSON 对象中重复键并不是一个好主意。 JSON 允许这样做,但是当 JSON 对象转换为 Python dict 时,正确处理它会很痛苦。

标签: python json pandas python-requests


【解决方案1】:

所以基本上是这样的:

 payload = '"company": {"name": "' + company + '", "founders": {' + names_json_str + '}'

API 的格式错误,修复它解决了问题

【讨论】:

    【解决方案2】:

    如何格式化 json 字符串完全取决于服务器的要求。

    如果服务器接受公司 json 字符串为:

    {"company": {"name": "Micro inc.", "founders": ["Jim D", "Susan A"]}}
    

    你可以这样做:

    finalJSON = []
    rows = [('Micro inc.', ('Jim D', 'Susan A')),
            ('Vitacore', ('Billy B', 'Sally Q', 'Mark G'))]
    
    for company_name, founders in rows: 
        # replace rows with real data, e.g. df.iterrows() 
        founders = ', '.join('"{}"'.format(founder) for founder in founders)
        json_str = '{{"company": {{"name": "{}", "founders": [{}]}}}}'.format(company_name, founders)
        finalJSON.append(json_str)
    
    for company in finalJSON:
        print(company)
        # do stuff with company
    

    【讨论】:

    • 我刚刚更新了我的问题,以提供我正在尝试做的事情的完整背景。我认为我将 pandas DataFrame 对象转换为请求条目的方式有点不对劲。
    • 我尝试了您推荐的代码,不幸的是,在发布请求中使用时,API 不接受循环中的公司
    • @cgclip 这是预期的。作为 API 的用户,您应该知道格式要求。我只提供一个例子。
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多