Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.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
Python 读取数据帧中的嵌套json文件_Python_Json_Pandas_Nested_Tweets - Fatal编程技术网

Python 读取数据帧中的嵌套json文件

Python 读取数据帧中的嵌套json文件,python,json,pandas,nested,tweets,Python,Json,Pandas,Nested,Tweets,我有一个JSON文件,其结构如下(它不是完整的JSON文件,但结构相同): 我的问题:如何将此数据加载到具有以下列的数据框中:类型,id(引用的tweet id),文本,在处创建,作者id,以及id(tweet id) 到目前为止我能做什么:我可以得到以下专栏: 被引用的tweets 文本 陶制 作者id id(推特id) [{'type':'xx','id':'xxx'}] xxx xxxx xxxxx XXXXXXXXXX 在json\u normalize()中使用嵌套的json时,需要使

我有一个JSON文件,其结构如下(它不是完整的JSON文件,但结构相同):

我的问题:如何将此数据加载到具有以下列的数据框中:
类型
id(引用的tweet id)
文本
处创建,
作者id
,以及
id(tweet id)

到目前为止我能做什么:我可以得到以下专栏:

被引用的tweets 文本 陶制 作者id id(推特id) [{'type':'xx','id':'xxx'}] xxx xxxx xxxxx XXXXXXXXXX
json\u normalize()
中使用嵌套的json时,需要使用
meta
参数来获取元级别的字段。所以,基本上你要做的是取嵌套的并对其进行规范化,然后从上面的一个级别连接其他几个字段。显然,您可以将其组合为多个嵌套字段,请参见以供参考

import json
import pandas as pd

j = '{"data":[{"referenced_tweets":[{"type":"retweeted","id":"xxxxxxx"}],"text":"abcdefghijkl","created_at":"2020-03-09T00:11:41.000Z","author_id":"xxxxx","id":"xxxxxxxxxxx"},{"referenced_tweets":[{"type":"retweeted","id":"xxxxxxxxxxxx"}],"text":"abcdefghijkl","created_at":"2020-03-09T00:11:41.000Z","author_id":"xxxxxxxx","id":"xxxxxxxxxxx"}]}'
j = json.loads(j)

# since you have id twice, it's a bit more complicated and you need to 
# introduce a meta prefix
df = pd.json_normalize(
    j,
    record_path=["data", 'referenced_tweets'],
    meta_prefix="data.",
    meta=[["data", "text"], ["data", "created_at"], ["data", "author_id"], ["data", "id"]]
    )
print(df)
导致:

        type            id data.data.text      data.data.created_at  \
0  retweeted       xxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.data.author_id data.data.id  
0               xxxxx  xxxxxxxxxxx  
1            xxxxxxxx  xxxxxxxxxx
        type            id     data.text           data.created_at  \
0  retweeted       xxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.author_id      data.id  
0          xxxxx  xxxxxxxxxxx  
1       xxxxxxxx  xxxxxxxxxxx 
我更喜欢这种方式,因为它似乎更容易处理

df = pd.json_normalize(
    j["data"],
    record_path=['referenced_tweets'],
    meta_prefix="data.",
    meta=["text", "created_at", "author_id", "id"]
    )
print(df)
导致:

        type            id data.data.text      data.data.created_at  \
0  retweeted       xxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.data.author_id data.data.id  
0               xxxxx  xxxxxxxxxxx  
1            xxxxxxxx  xxxxxxxxxx
        type            id     data.text           data.created_at  \
0  retweeted       xxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.author_id      data.id  
0          xxxxx  xxxxxxxxxxx  
1       xxxxxxxx  xxxxxxxxxxx 

json\u normalize()
中使用嵌套的json时,需要使用
meta
参数来获取元级别的字段。所以,基本上你要做的是取嵌套的并对其进行规范化,然后从上面的一个级别连接其他几个字段。显然,您可以将其组合为多个嵌套字段,请参见以供参考

import json
import pandas as pd

j = '{"data":[{"referenced_tweets":[{"type":"retweeted","id":"xxxxxxx"}],"text":"abcdefghijkl","created_at":"2020-03-09T00:11:41.000Z","author_id":"xxxxx","id":"xxxxxxxxxxx"},{"referenced_tweets":[{"type":"retweeted","id":"xxxxxxxxxxxx"}],"text":"abcdefghijkl","created_at":"2020-03-09T00:11:41.000Z","author_id":"xxxxxxxx","id":"xxxxxxxxxxx"}]}'
j = json.loads(j)

# since you have id twice, it's a bit more complicated and you need to 
# introduce a meta prefix
df = pd.json_normalize(
    j,
    record_path=["data", 'referenced_tweets'],
    meta_prefix="data.",
    meta=[["data", "text"], ["data", "created_at"], ["data", "author_id"], ["data", "id"]]
    )
print(df)
导致:

        type            id data.data.text      data.data.created_at  \
0  retweeted       xxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.data.author_id data.data.id  
0               xxxxx  xxxxxxxxxxx  
1            xxxxxxxx  xxxxxxxxxx
        type            id     data.text           data.created_at  \
0  retweeted       xxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.author_id      data.id  
0          xxxxx  xxxxxxxxxxx  
1       xxxxxxxx  xxxxxxxxxxx 
我更喜欢这种方式,因为它似乎更容易处理

df = pd.json_normalize(
    j["data"],
    record_path=['referenced_tweets'],
    meta_prefix="data.",
    meta=["text", "created_at", "author_id", "id"]
    )
print(df)
导致:

        type            id data.data.text      data.data.created_at  \
0  retweeted       xxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx   abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.data.author_id data.data.id  
0               xxxxx  xxxxxxxxxxx  
1            xxxxxxxx  xxxxxxxxxx
        type            id     data.text           data.created_at  \
0  retweeted       xxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   
1  retweeted  xxxxxxxxxxxx  abcdefghijkl  2020-03-09T00:11:41.000Z   

  data.author_id      data.id  
0          xxxxx  xxxxxxxxxxx  
1       xxxxxxxx  xxxxxxxxxxx 

谢谢你的回答。你的代码几乎给了我所需要的列。我只是不知道为什么
id(tweet id)
列丢失了。你知道吗?应该有两个
id
列。一个id表示引用的_tweet id,另一个(缺少的一个)表示tweetid@mOna啊,对不起,我明白了,秒,我会更新我的answer@mOna它已修复感谢更新。我能问一下为什么只缺少
id
?我的意思是,所有其他栏目(例如,作者id、对话id)都有。谢谢你的回答。你的代码几乎给了我所需要的列。我只是不知道为什么
id(tweet id)
列丢失了。你知道吗?应该有两个
id
列。一个id表示引用的_tweet id,另一个(缺少的一个)表示tweetid@mOna啊,对不起,我明白了,秒,我会更新我的answer@mOna它已修复感谢更新。我能问一下为什么只缺少
id
?我的意思是,所有其他栏目(例如,作者id、对话id)都有。谢谢你的回答。非常感谢。当我运行您的代码时,我遇到了这个错误:
模块“pandas”没有属性“json\u normalize”
。我也导入了以下内容:
import json
from pandas.io.json import json_normalize
import pandas as pd
您可以更新pandas,您可能正在使用v.1.2.3之前的版本<代码>json_normalize在该版本之前就存在于io工具中。现在使用
pandas.io.json
时,您可能会收到未来警告,谢谢您的回答。非常感谢。当我运行您的代码时,我遇到了这个错误:
模块“pandas”没有属性“json\u normalize”
。我也导入了以下内容:
import json
from pandas.io.json import json_normalize
import pandas as pd
您可以更新pandas,您可能正在使用v.1.2.3之前的版本<代码>json_normalize在该版本之前就存在于io工具中。使用
pandas.io.json