如何用字典推导式提取Pandas DataFrame每行tick_pt的x/y值并新增列?
提取Pandas DataFrame中刻度点的x/y值
当然可以用字典推导式结合Pandas的apply方法实现,比逐行循环高效得多。以下是具体实现方案:
假设你的DataFrame结构示例
先模拟一个符合你描述的DataFrame(每行对应图像ID,x_ticks/y_ticks列是包含tick_pt的字典):
import pandas as pd df = pd.DataFrame({ "image_id": [1, 2, 3], "x_ticks": [ {"tick_pt": {"x": 100, "y": 50}}, {"tick_pt": {"x": 200, "y": 60}}, {"tick_pt": {"x": 300, "y": 70}} ], "y_ticks": [ {"tick_pt": {"x": 30, "y": 150}}, {"tick_pt": {"x": 40, "y": 160}}, {"tick_pt": {"x": 50, "y": 170}} ] })
提取单个刻度列的x/y值
用apply配合字典推导式,将每行tick_pt中的x、y值展开为新列:
# 提取x_ticks中的tick_pt的x、y值 df[['x_tick_x', 'x_tick_y']] = df['x_ticks'].apply( lambda d: pd.Series({ 'x_tick_x': d['tick_pt']['x'], 'x_tick_y': d['tick_pt']['y'] }) ) # 提取y_ticks中的tick_pt的x、y值 df[['y_tick_x', 'y_tick_y']] = df['y_ticks'].apply( lambda d: pd.Series({ 'y_tick_x': d['tick_pt']['x'], 'y_tick_y': d['tick_pt']['y'] }) )
批量处理多列(更简洁)
如果需要同时处理x_ticks和y_ticks,可以用循环+字典推导式批量生成新列:
for tick_col in ['x_ticks', 'y_ticks']: # 生成新列名(比如x_ticks → x_tick_x、x_tick_y) base_name = tick_col[:-1] df[[f'{base_name}_x', f'{base_name}_y']] = df[tick_col].apply( lambda d: pd.Series({ f'{base_name}_x': d['tick_pt']['x'], f'{base_name}_y': d['tick_pt']['y'] }) )
若tick_pt是多刻度点列表的情况
如果你的tick_pt是包含多个刻度点的列表(比如一个图像有多个x刻度),可以用列表推导式提取所有x/y值组成列表列:
# 假设x_ticks结构为{"tick_pt": [{"x":10, "y":20}, {"x":30, "y":40}]} df['x_tick_x_list'] = df['x_ticks'].apply(lambda d: [pt['x'] for pt in d['tick_pt']]) df['x_tick_y_list'] = df['x_ticks'].apply(lambda d: [pt['y'] for pt in d['tick_pt']])
以上方法避免了低效的逐行循环,利用Pandas的向量化操作特性,同时通过字典/列表推导式清晰地完成值的提取。
内容的提问来源于stack exchange,提问作者Rapha Nash
相关产品推荐
相关产品推荐

