我有数据帧,如下所示.

id name code date Additional info
01 shirt xyz123 2022-01-01 [{'name': 'phone', 'code': 'ph123'}, {'name': 'car', 'code': 'cx2022'}, {}]
02 bike bk001 2022-12-10 [{}, {}, {}]
03 phone ph987 2023-02-10 [{'name': 'shirt', 'code': 'xyz456'}]

我想将每个JSON的附加信息列和赋值分别取消嵌套到名称列和代码列中.预期输出如下所示.新添加的行在取消嵌套的附加信息列后加粗.在最终输出中,附加信息列将被删除.

Expected DataFrame output:

id name code date
01 shirt xyz123 2022-01-01
01 phone ph123 2022-01-01
01 car cx2022 2022-01-01
02 bike bk001 2022-12-10
03 phone ph987 2023-02-10
03 shirt xyz456 2023-02-10

有人能帮我解决这个挑战吗? 谢谢.

推荐答案

您可以使用explode将字典转换为具有json_normalize的列,然后将joinconcat转换为原始DataFrame:

s = df['Additional info'].explode()

out = pd.concat([df[['id', 'name', 'code', 'date']], 
                 df[['id', 'date']].join(pd.json_normalize(s)
                                           .set_axis(s.index).dropna(),
                                         how='inner')
                ]).sort_index(kind='stable')

只需要知道要取消嵌套的列的变体:

cols = 'Additional info'

s = df[cols].explode()
tmp = df.drop(columns=col)

out = pd.concat([tmp, 
                 pd.json_normalize(s)
                   .set_axis(s.index).dropna()
                   .combine_first(tmp)
                ]).drop_duplicates().sort_index(kind='stable')

输出:

   id   name    code        date
0   1  shirt  xyz123  2022-01-01
0   1  phone   ph123  2022-01-01
0   1    car  cx2022  2022-01-01
1   2   bike   bk001  2022-12-10
2   3  phone   ph987  2023-02-10
2   3  shirt  xyz456  2023-02-10

Python相关问答推荐

使用unmanagedexports从Python调用的c#DLC

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

如何获取Django REST框架中序列化器内部的外卡属性?

在Python中为变量的缺失值创建虚拟值

使用Keras的线性回归参数估计

将特定列信息移动到当前行下的新行

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

管道冻结和管道卸载

用Python解密Java加密文件

无法使用requests或Selenium抓取一个href链接

在np数组上实现无重叠的二维滑动窗口

ThreadPoolExecutor和单个线程的超时

为一个组的每个子组绘制,

什么是最好的方法来切割一个相框到一个面具的第一个实例?

不允许访问非IPM文件夹

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

Python Pandas获取层次路径直到顶层管理

旋转多边形而不改变内部空间关系

Gekko中基于时间的间隔约束

PYTHON、VLC、RTSP.屏幕截图不起作用