Python 读取数据帧中的嵌套json文件
我有一个JSON文件,其结构如下(它不是完整的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时,需要使
类型
,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