Python为DataFrame新增列时每行被赋值完整列表的异常问题
问题原因
你的循环逻辑存在本质错误:循环体内计算mean的代码完全没有用到循环索引i,每次执行(df['h1_glucose_max']+df['h1_glucose_min'])/2时,计算得到的不是当前单行的均值,而是长度与DataFrame总行数一致的整列均值Series。
循环执行len(df)次后,你得到的glucose_mean不是存储单个数值的一维列表,而是嵌套了len(df)个Series的二维嵌套列表——虽然它的顶层长度和DataFrame行数一致,但每个元素都是一整列的计算结果,赋值给新列时pandas就会把整个列表对象填充到每一行的单元格中,才会出现单元格存储完整列表的异常效果。
解决方案
pandas原生支持向量化整列运算,不需要写for循环逐行遍历,直接一行代码即可完成计算和赋值,运算效率更高也不会出现对齐错误:
df['glucose'] = (df['h1_glucose_max'] + df['h1_glucose_min']) / 2
如果你出于特殊场景必须使用循环实现(性能比向量化运算低几个数量级,非必要不推荐),需要在循环中显式取当前行的两个字段值计算,不能直接对整列做运算:
glucose_mean = [] for i in range(len(df)): row_val_max = df.loc[i, 'h1_glucose_max'] row_val_min = df.loc[i, 'h1_glucose_min'] glucose_mean.append((row_val_max + row_val_min)/2) df['glucose'] = glucose_mean
赋值完成后可以通过print(df[['h1_glucose_max', 'h1_glucose_min', 'glucose']].head())校验结果,每一行的glucose值都会是对应行两个字段的均值,不会再出现单元格存储整个列表的问题。
内容的提问来源于stack exchange,提问作者Saniaaa
相关产品推荐
相关产品推荐

