Pandas DataFrame to_json() 生成带点符号的索引

Posted

技术标签:

【中文标题】Pandas DataFrame to_json() 生成带点符号的索引【英文标题】:Pandas DataFrame to_json() results in index with dot notation 【发布时间】:2015-05-04 16:10:08 【问题描述】:

我有一个需要转换为 JSON 的 Pandas DataFrame。 to_json() DataFrame 方法产生可接受的格式,但它将我的 DataFrame 索引转换为字符串(例如,0 变为“0.0”)。我需要“0”。

DataFrame 来自 JSON,使用 pd.io.json.read_json() 方法,将索引设置为 float64。

输入 JSON:

"chemical": "1": "chem2", "0": "chem1", 
"type": "1": "pesticide", "0": "pesticide"

DataFrame(来自read_json()):

  chemical  type
0 chem1    pesticide
1 chem2    pesticide

生成的 JSON(来自 to_json()):

"chemical": "0.0": "chem1", "1.0": "chem2",
"type": "0.0": "pesticide", "1.0": "pesticide"

需要 JSON:

"chemical": "0": "chem1", "1": "chem2",
"type": "0": "pesticide", "1": "pesticide"

【问题讨论】:

【参考方案1】:

似乎索引的 dtype 是浮点数(检查 df.index.dtype)。您需要将其转换为 int:

df.index = df.index.astype(int)
df.to_json()
=> "chemical": "0": "chem1", "1": "chem2", "type": "0": "pesticide", "1": "pesticide"

【讨论】:

我的索引是 type == float64,并尝试将其转换为 int 会引发以下问题:TypeError: Setting <class 'pandas.core.index.Float64Index'> dtype to anything other than float64 or object is not supported pd.io.json.read_json() 方法将索引设置为 float64,我在 OP 中没有提到。这会导致 to_json() 方法将我的索引表示为浮点数(例如 0 -> "0.0")。【参考方案2】:

@shx2 为我指明了正确的方向,但我改变了从 JSON 创建 DataFrame 的方法。

我没有在 JSON 字符串上使用 to_json() 方法,而是在 JSON 上使用 pd.DataFrame.from_dict() 方法作为 Python 字典来创建 DataFrame。这导致df.index.dtype == dtype('O')

我必须在 from_dict() 方法中设置 dtype='float64' 才能为非字符串条目设置正确的 dtype。

pd_obj = pd.DataFrame.from_dict(request.json["inputs"], dtype='float64')

【讨论】:

以上是关于Pandas DataFrame to_json() 生成带点符号的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何以附加模式导出 DataFrame to_json - Python Pandas?

pandas.to_json 以特定形式输出日期格式

以 unicode 将 pandas DataFrame 写入 JSON

将 pandas.DataFrame 转换为 Python 中的字典列表

将 Pandas DataFrame 和元数据保存为 JSON 格式

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