如何访问Pandas DataFrame数组类型列的元素并拆分为独立列
解决方法
问题根因
你使用df.column3[1]返回整列的核心原因是链式索引触发了pandas的列优先匹配逻辑,同时数组类型的列默认以object格式存储,直接链式取值容易出现索引错位。
方案1:直接访问column3中的指定元素
用pandas官方推荐的.loc索引取值,避免链式索引的异常:
# 取第1行(索引为0)的column3数组中第1个字典(port_no=1的记录) df.loc[0, 'column3'][0] # 取第1行column3数组中第2个字典(port_no=2的记录) df.loc[0, 'column3'][1]
如果要批量查询所有行指定port_no的status,直接用apply遍历即可:
# 新增列存储port_no=1对应的status df['port1_status'] = df['column3'].apply(lambda x: [i['status'] for i in x if i['port_no']==1][0])
方案2:将port信息拆分为独立列
用explode+字段拆分的方法,比applymap更适配数组嵌套字典的场景:
import pandas as pd # 1. 把column3的数组展开,每个字典单独占一行 df_explode = df.explode('column3', ignore_index=False) # 2. 把字典的key拆为独立字段 df_explode[['port_no', 'status', 'ts']] = df_explode['column3'].apply(pd.Series) # 3. 按行聚合,把不同port的信息转为独立列 df_result = df_explode.pivot(columns='port_no', values=['status', 'ts', 'column3']).reset_index() # 重命名列方便查询 df_result.columns = [f'{col[0]}_port{col[1]}' if col[1] else col[0] for col in df_result.columns]
处理后你可以直接通过df_result['status_port1']直接查询port1的status值。
方案3:匹配你给出的预期输出格式
如果只需要把数组的两个元素拆为两个独立列,直接按索引取值即可:
df['column3'] = df['column3'].apply(lambda x: [x[0]]) df['col4'] = df['column3'].apply(lambda x: [x[1]])
运行后得到的DataFrame和你贴的预期输出完全一致。
内容的提问来源于stack exchange,提问作者oneday
相关产品推荐
相关产品推荐

