作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个数据框,其中一列是一个 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 对象为“爱好”,第二行的 json 对象中不存在。与第二行类似,属性状态为空,即 []
问题:如何在 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 - 如何在 Python 中展平其中一列包含 json 对象的数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72713108/
我是一名优秀的程序员,十分优秀!