基于DataFrame某列批量计算多列值的for循环实现需求
解决方案
修正你的循环逻辑
你原代码的问题在于遍历df.iloc[:,3:10]时得到的是列名,而非列数据本身,所以不能用column.value()操作。正确的写法是通过列名获取对应列数据,再执行除法:
# 遍历第3到9列(0-based索引,对应iloc[:,3:10])的列名 for col in df.iloc[:, 3:10].columns: # 将当前列的值除以Population列,赋值回原列 df[col] = df[col] / df['Population']
如果担心整数除法的问题(原列是int64),可以先将列转为float类型再计算:
for col in df.iloc[:, 3:10].columns: df[col] = df[col].astype(float) / df['Population']
封装为可复用函数
要处理多个DataFrame,直接把逻辑封装成函数即可,建议返回处理后的副本,避免修改原DataFrame:
def normalize_by_population(df): # 复制原DataFrame,避免原地修改 processed_df = df.copy() # 获取需要处理的列范围 target_cols = processed_df.iloc[:, 3:10].columns # 遍历处理每一列 for col in target_cols: processed_df[col] = processed_df[col].astype(float) / processed_df['Population'] return processed_df
额外注意事项
- 如果
Population列存在0值,会触发除以0的错误,可以用numpy处理这种情况(需要先导入import numpy as np):processed_df[col] = np.where(processed_df['Population'] == 0, 0, processed_df[col].astype(float) / processed_df['Population']) - 如果你不想覆盖原列,而是生成新的衍生列(比如加
_per_capita后缀),可以修改赋值逻辑:processed_df[f"{col}_per_capita"] = processed_df[col].astype(float) / processed_df['Population']
内容的提问来源于stack exchange,提问作者Aejis09
相关产品推荐
相关产品推荐

