如何为DataFrame添加包含其他列数据的JSON对象列?
问题:为DataFrame添加包含其他列信息的JSON列
初始DataFrame结构:
| col_1 | col_2 |
|---|---|
| 1 | 1 |
| 2 | 2 |
尝试用以下代码添加JSON列:
for i, row in df: i_val = row.to_json() df.at[i,'raw_json'] = i_val
但得到了JSON嵌套重复的结果:
| col_1 | col_2 | raw_json |
|---|---|---|
| 1 | 1 | {"col_1":1,"col_2":1,"raw_json":{"col_1":1,"col_2":1}} |
| 2 | 2 | {"col_1":2,"col_2":2,"raw_json":{"col_1":2,"col_2":2}} |
期望的正确结果:
| col_1 | col_2 | raw_json |
|---|---|---|
| 1 | 1 | {"col_1":1,"col_2":1} |
| 2 | 2 | {"col_1":2,"col_2":2} |
解决方法
原因分析
循环中修改DataFrame时,后续迭代的row会包含刚添加的raw_json列,导致row.to_json()把新列也纳入序列化范围,形成嵌套。另外原循环写法有误,正确遍历行需用df.iterrows(),但即使修正写法,嵌套问题仍会存在。
正确代码示例
方法1:指定原始列生成JSON
直接选择需要转换的原始列,避免包含新添加的列:
df['raw_json'] = df[['col_1', 'col_2']].apply(lambda row: row.to_json(), axis=1)
方法2:基于原始副本生成JSON
先复制一份原始DataFrame,基于副本生成JSON后再添加到原DataFrame:
original_df = df.copy() df['raw_json'] = original_df.apply(lambda row: row.to_json(), axis=1)
方法3:用字典转JSON(更灵活)
如果需要自定义JSON格式,可先转成字典再序列化:
import json df['raw_json'] = df[['col_1', 'col_2']].apply(lambda row: json.dumps(row.to_dict()), axis=1)
以上方法均能避开循环修改DataFrame的问题,直接生成仅包含原始列信息的JSON字符串。
内容的提问来源于stack exchange,提问作者thejoker34
相关产品推荐
相关产品推荐

