拆开 pandas 中的 json 个词典
Unstacking json dictionaries in pandas
我给你准备了一份。
所以我正在尝试解压一些我从 api 获得的专有数据。
对于一个可重现的例子,一旦我解压缩 json 数据,我得到一个看起来像这样的字典
temp = ([{"date" : "12/15/2020","order_id" : 1, "order_items" : [{"name" : "sponge", "quantity" : 2},{"name" : "soap", "quantity" : 17}]},
{"date" : "12/14/2020","order_id" : 2, "order_items" : [{"name" : "soap", "quantity" : 4}]}]
)
然后我使用这段代码制作数据框
df = pd.json_normalize(temp)
现在这给我的是一个看起来有点像这样的数据框。
what_i_have = pd.DataFrame({
"date" : ["12/15/2020","12/14/2020"],
"order_id" : [1,2],
"order_items" : [[{'name' : 'sponge', 'quantity' : 2},{'name' : 'soap', 'quantity' : 17}],[{'name' : 'sponge', 'quantity' : 4}]]
})
现在,我发现问题是当我使用 json_normalize 时它没有下降到足够的水平。
如果我做类似
pd.json_normalize(df['order_items'][0])
它 returns 对我来说是一个 2 行 2 列的数据框。
如果我这样做
df['order_items'] = df['order_items'].apply(lambda x: pd.json_normalize(x))
我得到一个数据框,在 order_items 列中有数据框对象,但我不太清楚如何使用它。
我想做的是解压缩我在较低级别创建的表,并使我的数据帧更长。我希望它看起来像这样
what_i_want = pd.DataFrame({
"date" : ["12/15/2020","12/15/2020","12/14/2020"],
"order_id" : [1,1,2],
"order_items.name" : ["sponge","soap","soap"],
"order_items.quantity" : [2,17,4]
})
关于如何做到这一点有什么建议吗?
ps。我认为 json_normalize 没有下降到足够水平的原因是因为 order_items 有不同的长度。
- 必须使用
pandas.json_normalize
的其他参数才能正确解压缩数据。
import pandas as pd
# sample data
temp = [{'date': '12/15/2020', 'order_id': 1, 'order_items': [{'name': 'sponge', 'quantity': 2}, {'name': 'soap', 'quantity': 17}]}, {'date': '12/14/2020', 'order_id': 2, 'order_items': [{'name': 'soap', 'quantity': 4}]}]
# unpack temp using the other parameters
df = pd.json_normalize(data=temp, record_path=['order_items'], meta=['date', 'order_id'])
# display(df)
name quantity date order_id
0 sponge 2 12/15/2020 1
1 soap 17 12/15/2020 1
2 soap 4 12/14/2020 2
我给你准备了一份。
所以我正在尝试解压一些我从 api 获得的专有数据。
对于一个可重现的例子,一旦我解压缩 json 数据,我得到一个看起来像这样的字典
temp = ([{"date" : "12/15/2020","order_id" : 1, "order_items" : [{"name" : "sponge", "quantity" : 2},{"name" : "soap", "quantity" : 17}]},
{"date" : "12/14/2020","order_id" : 2, "order_items" : [{"name" : "soap", "quantity" : 4}]}]
)
然后我使用这段代码制作数据框
df = pd.json_normalize(temp)
现在这给我的是一个看起来有点像这样的数据框。
what_i_have = pd.DataFrame({
"date" : ["12/15/2020","12/14/2020"],
"order_id" : [1,2],
"order_items" : [[{'name' : 'sponge', 'quantity' : 2},{'name' : 'soap', 'quantity' : 17}],[{'name' : 'sponge', 'quantity' : 4}]]
})
现在,我发现问题是当我使用 json_normalize 时它没有下降到足够的水平。 如果我做类似
pd.json_normalize(df['order_items'][0])
它 returns 对我来说是一个 2 行 2 列的数据框。 如果我这样做
df['order_items'] = df['order_items'].apply(lambda x: pd.json_normalize(x))
我得到一个数据框,在 order_items 列中有数据框对象,但我不太清楚如何使用它。
我想做的是解压缩我在较低级别创建的表,并使我的数据帧更长。我希望它看起来像这样
what_i_want = pd.DataFrame({
"date" : ["12/15/2020","12/15/2020","12/14/2020"],
"order_id" : [1,1,2],
"order_items.name" : ["sponge","soap","soap"],
"order_items.quantity" : [2,17,4]
})
关于如何做到这一点有什么建议吗?
ps。我认为 json_normalize 没有下降到足够水平的原因是因为 order_items 有不同的长度。
- 必须使用
pandas.json_normalize
的其他参数才能正确解压缩数据。
import pandas as pd
# sample data
temp = [{'date': '12/15/2020', 'order_id': 1, 'order_items': [{'name': 'sponge', 'quantity': 2}, {'name': 'soap', 'quantity': 17}]}, {'date': '12/14/2020', 'order_id': 2, 'order_items': [{'name': 'soap', 'quantity': 4}]}]
# unpack temp using the other parameters
df = pd.json_normalize(data=temp, record_path=['order_items'], meta=['date', 'order_id'])
# display(df)
name quantity date order_id
0 sponge 2 12/15/2020 1
1 soap 17 12/15/2020 1
2 soap 4 12/14/2020 2