将 pandas DataFrame 行转换为 JSON 模式,然后发出 POST 请求

Posted

技术标签:

【中文标题】将 pandas DataFrame 行转换为 JSON 模式,然后发出 POST 请求【英文标题】:Converting pandas DataFrame rows a JSON schema and then making a POST Request 【发布时间】: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 时,正确处理它会很痛苦。 【参考方案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 的用户,您应该知道格式要求。我只提供一个例子。

以上是关于将 pandas DataFrame 行转换为 JSON 模式,然后发出 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Pandas DataFrame 的列和行子集转换为 numpy 数组?

将 pandas DataFrame 行转换为 JSON 模式,然后发出 POST 请求

将 pandas Dataframe 的行转换为可迭代的字符串列表

使用形状的因子级别将 pandas.DataFrame 转换为 numpy 张量 [重复]

Python Pandas:将 2,000,000 个 DataFrame 行转换为二进制矩阵 (pd.get_dummies()) 而不会出现内存错误?

如何将 pandas DataFrame 行保存为 JSON 字符串?