将Pandas数据帧转换为JSON格式。

109

我有一个 Pandas DataFrame,它有两列 - 一列是文件名,另一列是生成文件的小时:

 File       Hour
  F1         1
  F1         2
  F2         1
  F3         1

我试图将其转换为以下格式的JSON文件:

{"File":"F1","Hour":"1"} 
{"File":"F1","Hour":"2"}
{"File":"F2","Hour":"1"}
{"File":"F3","Hour":"1"}
当我使用命令DataFrame.to_json(orient="records")时,我得到以下格式的记录:
[{"File":"F1","Hour":"1"},
 {"File":"F1","Hour":"2"},
 {"File":"F2","Hour":"1"},
 {"File":"F3","Hour":"1"}]

我只是想知道是否有选项可以按照需要的格式获取JSON文件。任何帮助将不胜感激。


25
你想要的不是合适的 JSON 格式。使用 dataframe.to_json(orient="records") 得到的才是合适的 JSON 格式。 - piRSquared
9个回答

93

在较新的pandas版本(我相信是0.20.0+)中,这可以直接完成:

df.to_json('temp.json', orient='records', lines=True)

直接压缩也是可能的:

df.to_json('temp.json.gz', orient='records', lines=True, compression='gzip')

1
在我看来,这是最佳解决方案! - Aman
2
天啊,我被这个问题困扰了很久,结果是如此愚蠢,感谢你的帮助,非常感谢(由于某些原因,我无法使用临时CSV文件),不管怎样,谢谢!! - Patrick Ruff

93
使用 DF.to_json 方法得到的输出是一个字符串。因此,您可以根据需要对其进行切片,并将其中的逗号去掉。
out = df.to_json(orient='records')[1:-1].replace('},{', '} {')

要将输出写入文本文件,您可以执行以下操作:

with open('file_name.txt', 'w') as f:
    f.write(out)

这将删除两个关键值对之间的逗号: {"ServerGroup":"Map""Hour":0}。我需要它变成{"ServerGroup":"Map","Hour":0}。 - user3447653
是的,那是我的错误。请尝试修改后的代码。 - Nickil Maveli
这是因为它不再是一个json格式的对象,而是一个json-string。尝试将参数改为path_or_buf=None - Nickil Maveli
好的,谢谢。但我需要将它保存在一个文件中,不知道有没有办法实现呢? - user3447653
属性错误:'dict'对象没有'to_json'属性。 - Mona Jalal
显示剩余2条评论

28

我认为OP所寻找的是:

with open('temp.json', 'w') as f:
    f.write(df.to_json(orient='records', lines=True))

这应该就行了。


1
应该是最佳答案。清晰简洁。 - MrR

13

试试这个:

json.dumps(json.loads(df.to_json(orient="records")))

9
使用以下公式将 Pandas DataFrame 转换为字典列表:
import json
json_list = json.loads(json.dumps(list(DataFrame.T.to_dict().values())))

4
将数据框架转换为字典列表
list_dict = []

for index, row in list(df.iterrows()):
    list_dict.append(dict(row))

保存文件

with open("output.json", mode) as f:
    f.write("\n".join(str(item) for item in list_dict))

1
为了将数据框转换为真实的JSON(而不是字符串),我使用以下代码:
    from io import StringIO
    import json
    import DataFrame

    buff=StringIO()
    #df is your DataFrame
    df.to_json(path_or_buf=buff,orient='records')
    dfJson=json.loads(buff)

0

不要使用 dataframe.to_json(orient = “records”),而是使用 dataframe.to_json(orient = “index”)。 我的上述代码将数据框转换为字典格式的JSON,例如 {index -> {column -> value}}。


也许这取决于您尝试使用的数据的方向。 - Rahul Bali

-2
这是一个小型工具类,可以将 JSON 转换为 DataFrame 然后再转回来:希望您会觉得这很有用。
# -*- coding: utf-8 -*-
from pandas.io.json import json_normalize

class DFConverter:

    #Converts the input JSON to a DataFrame
    def convertToDF(self,dfJSON):
        return(json_normalize(dfJSON))

    #Converts the input DataFrame to JSON 
    def convertToJSON(self, df):
        resultJSON = df.to_json(orient='records')
        return(resultJSON)

1
可行,但实际上只是同样可用的单行函数的包装器。我认为在大多数情况下,以这种形式呈现是没有必要的。 - MattSom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接