我有一个dataframe,其中一列是json对象,如下所示

customer_id |    date    |             json_object
--------------------------------------------------------------------------
A101        | 2022-06-21 | {'name':['james'],'age':[55], 'hobby':['pubg']}
A102        | 2022-06-22 | {'name':['tarzan'],'status':[]}

jason对象的内容不统一.在上面的示例中,第一行中的json对象为"hobby",第二行的json对象中不存在该对象.与第二行类似,属性状态为空,即【】

Question:如何在Python中展平此数据帧以创建一个新的数据帧,其中每行仅对应一个json对象,如下所示

customer_id |    date    | attribute
---------------------------------------------
A101        | 2022-06-21 | 'name': 'james'
A101        | 2022-06-21 | 'age': 55
A101        | 2022-06-21 | 'hobby': 'pubg'
A102        | 2022-06-22 | 'name': 'tarzan'
A102        | 2022-06-22 | 'status':

推荐答案

假设json_object的每个值都是dict,也可以使用以下方法:

df = pd.DataFrame(
    data = {
        "customer_id": ["A101", "A102"],
        "date": ["2022-06-21", "2022-06-22"],
        "json_object": [{'name': 'james','age':55, 'hobby':'pubg'}, {'name': 'tarzan','status':'single'}]
    }
)
df["json_object"] = df["json_object"].map(lambda x: [[i, x[i]] for i in x])
df = df.explode(column="json_object")
df.json_object = df.json_object.str[0].astype(str) + ": " + df.json_object.str[1].astype(str) 
df

------------------------------------------
    customer_id  date        json_object
0   A101         2022-06-21  name: james
0   A101         2022-06-21  age: 55
0   A101         2022-06-21  hobby: pubg
1   A102         2022-06-22  name: tarzan
1   A102         2022-06-22  status: single
------------------------------------------

编辑

因为您将数据框更改为

df = pd.DataFrame(
    data = {
        "customer_id": ["A101", "A102"],
        "date": ["2022-06-21", "2022-06-22"],
        "json_object": [{'name': ['james'],'age':[55], 'hobby':['pubg']}, {'name': ['tarzan'],'status':['single']}]
    }
)

我的代码必须调整如下:

df = pd.DataFrame(
    data = {
        "customer_id": ["A101", "A102"],
        "date": ["2022-06-21", "2022-06-22"],
        "json_object": [{'name': ['james'],'age':[55], 'hobby':['pubg']}, {'name': ['tarzan'],'status':['single']}]
    }
)
df["json_object"] = df["json_object"].map(lambda x: [[i, x[i][0]] for i in x])
df = df.explode(column="json_object")
df.json_object = df.json_object.str[0].astype(str) + ": " + df.json_object.str[1].astype(str) 
df

如果包含空列表,只需在lambda函数中添加if-else条件即可.注意,我还在下一个代码提取中重命名了这些列.

df = pd.DataFrame(
    data = {
        "customer_id": ["A101", "A102"],
        "date": ["2022-06-21", "2022-06-22"],
        "json_object": [{'name': ['james'],'age':[55], 'hobby':['pubg']}, {'name': ['tarzan'],'status':[]}]
    }
)
df["json_object"] = df["json_object"].map(lambda x: [[i, x[i][0]] if x[i] else [i, ""] for i in x])
df = df.rename(columns={"json_object": "attribute"}).explode(column="attribute")
df.attribute = df.attribute.str[0].astype(str) + ": " + df.attribute.str[1].astype(str) 

Python相关问答推荐

acme错误-Veritas错误:模块收件箱没有属性linear_util'

如何使用pandasDataFrames和scipy高度优化相关性计算

Python上的Instagram API:缺少client_id参数"

在Mac上安装ipython

对所有子图应用相同的轴格式

从spaCy的句子中提取日期

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

Flash只从html表单中获取一个值

在极中解析带有数字和SI前缀的字符串

python—telegraph—bot send_voice发送空文件

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

交替字符串位置的正则表达式

pandas:在操作pandora之后将pandora列转换为int

从列表中分离数据的最佳方式

无法在盐流道中获得柱子

使用xlsxWriter在EXCEL中为数据帧的各行上色

如何获取给定列中包含特定值的行号?

利用广播使减法更有效率

生产者/消费者-Queue.get by list

如何在开始迭代自定义迭代器类时重置索引属性?