将 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()) 而不会出现内存错误?