如何遍历Pandas DataFrame的每列与单元格并实现归一化替换
嘿,我来帮你搞定这个DataFrame遍历和归一化的问题!首先先提个小细节:你写的normalise函数里有个Python语法错误——else if得改成elif,不然会报错,修正后的版本是这样的:
def normalise(theMin, theMax, theVal): if theMin == theVal: return 0 elif theMax == theVal: return 1 return (theVal - theMin) / (theMax - theMin)
接下来分两种方案给你,一种是Pandas推荐的高效向量化操作,另一种是你要求的显式遍历列和单元格的方法:
方案一:高效向量化处理(推荐)
Pandas的核心优势就是向量化操作,比逐单元格遍历快得多,尤其以后数据量大的时候更明显。我们可以用apply对每一列单独处理,先计算列的最小值和最大值,再批量应用归一化逻辑:
import numpy as np def normalise_col(column): col_min = column.min() col_max = column.max() # 用numpy的where实现条件判断,批量处理整列数据 return np.where(column == col_min, 0, np.where(column == col_max, 1, (column - col_min)/(col_max - col_min))) # 对整个DataFrame的每一列应用函数 training_df = training_df.apply(normalise_col, axis=0)
这个方法会自动遍历每一列,然后一次性处理列内的所有单元格,代码简洁且效率高。
方案二:显式遍历列和单元格(满足你的遍历需求)
如果你确实需要逐列、逐单元格手动遍历,也可以这么做。先遍历每一列,获取该列的min和max,再遍历列内的每一行,逐个替换单元格值:
# 遍历DataFrame的每一列 for col_name in training_df.columns: # 获取当前列的最小值和最大值 current_min = training_df[col_name].min() current_max = training_df[col_name].max() # 遍历当前列的每一行索引 for row_idx in training_df.index: # 获取单元格当前值 cell_value = training_df.loc[row_idx, col_name] # 应用归一化函数并替换 training_df.loc[row_idx, col_name] = normalise(current_min, current_max, cell_value)
这种方法完全符合你“依次遍历全部4列,再遍历每一列所有行”的需求,逻辑直观,但效率不如向量化操作,适合小数据集(比如你的150行4列完全没问题)。
内容的提问来源于stack exchange,提问作者user7740495
相关产品推荐
相关产品推荐

