Pymongo列表嵌套字典数据导入pandas DataFrame时赋值异常解决
问题原因
你代码中df2["posX"] = y[0]["value"]这类写法是对整列统一赋值,每次循环都会覆盖df2所有行的对应列数值,最后一次循环用到的第三条数据就会覆盖所有行,导致所有行数值都和最后一条一致。
修复方案
方案1:修改原循环逻辑(最易理解)
先把每行的位置数据存入列表,最后一次性转DataFrame,避免反复修改DataFrame的列:
pos_list = [] # 遍历原df所有行 for i in range(len(df)): var_list = df.loc[i, 'position.vars'] pos_list.append([ var_list[0]['value'], var_list[1]['value'], var_list[2]['value'] ]) # 生成结果df2 df2 = pd.DataFrame(pos_list, columns=['posX', 'posY', 'posZ'])
如果一定要沿用逐行给df2赋值的写法,需要指定对应行的索引:
# 先初始化和原df行数相同的空df2 df2 = pd.DataFrame(index=df.index, columns=['posX', 'posY', 'posZ']) for i in range(len(df)): var_list = df.loc[i, 'position.vars'] df2.loc[i, 'posX'] = var_list[0]['value'] df2.loc[i, 'posY'] = var_list[1]['value'] df2.loc[i, 'posZ'] = var_list[2]['value']
方案2:pandas向量化写法(更简洁高效,无需显式写循环)
用apply函数直接处理每行的position.vars字段:
def extract_position(row): vars_lst = row['position.vars'] return pd.Series( [vars_lst[0]['value'], vars_lst[1]['value'], vars_lst[2]['value']], index=['posX', 'posY', 'posZ'] ) # 直接生成包含三列位置数据的df2 df2 = df.apply(extract_position, axis=1)
如果需要保留原DataFrame的Time、Returncode字段,直接合并即可:
df = pd.concat([df, df2], axis=1)
内容的提问来源于stack exchange,提问作者SyrixGG
相关产品推荐
相关产品推荐

