簡體   English   中英

如何將嵌套的 json 字符串拆分為 3 列並將其與 dataframe 中的 user_id 列相關聯?

[英]How do i split out nested json string into 3 columns and relate it to the user_id column in a dataframe?

我目前有一個 dataframe 有 2 列:user_id,項目。 示例數據是:

user_id = 01e716c9bec1423e1

items = [{'item_id': '31499834785910', 'price': 3000.0, 'quantity': 2.0}, {'item_id': '31919169077366', 'price': 2500.0, 'quantity': 1.0}, {'item_id': '32130388426870', 'price': 5000.0, 'quantity': 1.0}, {'item_id': '22640717824118', 'price': 2000.0, 'quantity': 1.0}, {'item_id': '32044129157238', 'price': 3000.0, 'quantity': 1.0}, {'item_id': '31492182245494', 'price': 1500.0, 'quantity': 1.0}]

項目可以包含更多的嵌套項目,更少甚至沒有。 我想要的最終產品是:

df['user_id','item_id','price','quantity'] with obviously a row per item. 

到目前為止,我已經嘗試過:

import pandas as pd
import ast
import numpy as np
import pyodbc
import json

mylist = list(df['items'])
mynewlist = []
for l in mylist:
    mynewlist.append(ast.literal_eval(l))
data_items = pd.DataFrame(mynewlist)
data_new = pd.concat([df,data_items],axis=1)
del data_new['items']

但這只會弄亂整個 dataframe 並在 NaN 上添加大約 40 列,但仍然沒有分解 json。

我已經找到了一些答案,但似乎都沒有幫助我。 所以任何幫助將不勝感激。 我也嘗試過 json_normalize ,但似乎無法弄清楚。

我覺得這是一個詳細的問題,很抱歉沒有以表格格式提供它,因為我不知道該怎么做,但是如果您需要更多信息,請告訴我。

您可以使用簡單for循環將user_id鍵和值添加到items列表中的每個字典:

import pandas as pd

user_id = '01e716c9bec1423e1'

items = [{'item_id': '31499834785910', 'price': 3000.0, 'quantity': 2.0},
         {'item_id': '31919169077366', 'price': 2500.0, 'quantity': 1.0},
         {'item_id': '32130388426870', 'price': 5000.0, 'quantity': 1.0}, 
         {'item_id': '22640717824118', 'price': 2000.0, 'quantity': 1.0},
         {'item_id': '32044129157238', 'price': 3000.0, 'quantity': 1.0},
         {'item_id': '31492182245494', 'price': 1500.0, 'quantity': 1.0}]

# add the user_id to each dictionary
for item in items:
    item['user_id'] = user_id

df = pd.DataFrame(items)

print(df)

Output:

          item_id   price  quantity            user_id
0  31499834785910  3000.0       2.0  01e716c9bec1423e1
1  31919169077366  2500.0       1.0  01e716c9bec1423e1
2  32130388426870  5000.0       1.0  01e716c9bec1423e1
3  22640717824118  2000.0       1.0  01e716c9bec1423e1
4  32044129157238  3000.0       1.0  01e716c9bec1423e1
5  31492182245494  1500.0       1.0  01e716c9bec1423e1

不使用循環的替代方法是:

import pandas as pd

user_id = ['01e716c9bec1423e1']

items = [{'item_id': '31499834785910', 'price': 3000.0, 'quantity': 2.0},
     {'item_id': '31919169077366', 'price': 2500.0, 'quantity': 1.0},
     {'item_id': '32130388426870', 'price': 5000.0, 'quantity': 1.0}, 
     {'item_id': '22640717824118', 'price': 2000.0, 'quantity': 1.0},
     {'item_id': '32044129157238', 'price': 3000.0, 'quantity': 1.0},
     {'item_id': '31492182245494', 'price': 1500.0, 'quantity': 1.0}]

df = pd.DataFrame(items)

# since user_id is a list, you just multiply by len(df) to have a list with the compatible length
df['user_id'] = user_id * len(df)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM