Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pandas/Python破坏数据帧中的JSON数据_Python_Json_String_Pandas - Fatal编程技术网

Pandas/Python破坏数据帧中的JSON数据

Pandas/Python破坏数据帧中的JSON数据,python,json,string,pandas,Python,Json,String,Pandas,我正在与一个API交互并获取JSON数据。 在JSON对象的顶层,我有“常规”数据,但有些字段有更高级的结构: { "foo": 1, "bar": "string", "spam": { "egg":"green", "ham":"yum", "ran": { "out_of":"fake_words"

我正在与一个API交互并获取JSON数据。 在JSON对象的顶层,我有“常规”数据,但有些字段有更高级的结构:

{
    "foo": 1,
    "bar": "string",
    "spam": {
                "egg":"green",
                "ham":"yum",
                "ran": {
                        "out_of":"fake_words"
                       }
            }
}
我需要将这些高级结构(“垃圾邮件”)保留为有效的JSON

我使用请求获取数据,并将其加载到熊猫数据帧中,如下所示:

api_result = api.get_data().json()     #the json output of the Request object
df = read_json(json.dumps(api_result))
正如我所期望的那样,这给了我一个很好的三列数据框架(这也是我想要的)。问题在于字符串:

foo    bar        spam
1      'string'   {'egg':'green','ham':'yum','ran':{'out_of':'fake_words'}
Pandas或Python已将我的数据中的所有字符串更改为单引号('),而不是有效的JSON双引号(“)。由于所有引号现在都是单引号,此行为会破坏所有需要有效JSON对象的下游处理


编辑-->我的程序写出一个csv,该csv被摄取到一个数据库表中,在许多字段中都需要有效的JSON。这个表被许多其他进程用于进一步的分析和数据准备。如果您想在Python中生成有效的JSON,最好的途径是内置的
JSON
包。您可以使用
dumps
函数从Python字典创建有效的JSON字符串:

>>> import json
>>> data = {'egg':'green','ham':'yum','ran':{'out_of':'fake_words'}}
>>> json.dumps(data)
'{"ham": "yum", "ran": {"out_of": "fake_words"}, "egg": "green"}'

基于已编辑问题的已编辑答案:

问题在于,当您将JSON读入Pandas数据帧时,它会将所有内容转换为Python对象。在您的例子中,JSON字符串将转换为Python dict,当您打印结果时,它会显示dict的Python字符串表示形式。这种表示形式几乎类似于JSON,但不是JSON

您需要做的是将数据帧中的dict转换为有效的JSON字符串。要在
“spam”
列中进行此转换,您可以使用
apply()
方法调用,例如

data['spam'] = data['spam'].apply(json.dumps)

现在,该列包含JSON字符串而不是Python dict。

如果您想在Python中生成有效的JSON,最好的方法是内置的
JSON
包。您可以使用
dumps
函数从Python字典创建有效的JSON字符串:

>>> import json
>>> data = {'egg':'green','ham':'yum','ran':{'out_of':'fake_words'}}
>>> json.dumps(data)
'{"ham": "yum", "ran": {"out_of": "fake_words"}, "egg": "green"}'

基于已编辑问题的已编辑答案:

问题在于,当您将JSON读入Pandas数据帧时,它会将所有内容转换为Python对象。在您的例子中,JSON字符串将转换为Python dict,当您打印结果时,它会显示dict的Python字符串表示形式。这种表示形式几乎类似于JSON,但不是JSON

您需要做的是将数据帧中的dict转换为有效的JSON字符串。要在
“spam”
列中进行此转换,您可以使用
apply()
方法调用,例如

data['spam'] = data['spam'].apply(json.dumps)
现在,该列包含JSON字符串而不是Python dict。

请尝试以下操作:

from pandas.io.json import json_normalize
import pandas as pd
import json
a = {
    "foo": 1,
    "bar": "string",
    "spam": {
                "egg":"green",
                "ham":"yum",
                "ran": {
                        "out_of":"fake_words"
                       }
            }
}
a["spam"] = json.dumps(a["spam"])
df = json_normalize(a)
df
试试这个:

from pandas.io.json import json_normalize
import pandas as pd
import json
a = {
    "foo": 1,
    "bar": "string",
    "spam": {
                "egg":"green",
                "ham":"yum",
                "ran": {
                        "out_of":"fake_words"
                       }
            }
}
a["spam"] = json.dumps(a["spam"])
df = json_normalize(a)
df

你能举个例子说明什么是“毁灭的”吗“?@是的,在上面的问题中,请注意初始数据都用双引号括起来。一旦将数据放入数据框中,所有数据现在都用单引号括起来。@jbarney:如果我们分别序列化垃圾邮件部分,然后将数据放到df中,可以吗?你能举一个什么“被破坏”的例子吗?@IanS是的,在上面的问题中,请注意初始数据都用双引号括起来。一旦数据放入数据框,所有数据现在都用单引号括起来。@jbarney:如果我们分别序列化垃圾邮件部分,然后将数据加载到df,可以吗?这就是我将数据放入数据框的方法,但当新数据放入数据框时,所有以前有效的JSON(带双引号)无效(使用单引号)。这只是数据帧中dict的Python字符串表示形式。要获得有效的json表示,请尝试另一种方式,例如
json.dumps(df['spam'][0])
从json创建数据帧时,pandas解析所有json并将其转换为Python对象。要从这些对象获取有效的JSON,可以调用
JSON.dumps(obj)
。这非常有效。现在,当我编写数据时,我有了有效的JSON。唯一的问题是JSON中的每个字段都有两个引号。这是另一个问题,我可能可以在df.to_csv()中配置它。谢谢我会“接受”答案,但一个错误不断发生,阻止我这么做。稍后我将重试这是我将数据放入Pandas数据框的操作,但当新数据在数据框中时,所有以前有效的JSON(使用双引号)都将无效(使用单引号)。这只是数据框中dict的Python字符串表示形式。要获得有效的json表示,请尝试另一种方式,例如
json.dumps(df['spam'][0])
从json创建数据帧时,pandas解析所有json并将其转换为Python对象。要从这些对象获取有效的JSON,可以调用
JSON.dumps(obj)
。这非常有效。现在,当我编写数据时,我有了有效的JSON。唯一的问题是JSON中的每个字段都有两个引号。这是另一个问题,我可能可以在df.to_csv()中配置它。谢谢我会“接受”答案,但一个错误不断发生,阻止我这么做。我稍后再试