如何无需遍历行批量转换Pandas DataFrame中带%后缀的数值?
问题:Pandas中无需遍历行的百分比数值转换方法?
原始DataFrame
import pandas as pd data_dict = {'id': {0: 'G1', 1: 'G2', 2: 'G3'}, 'S': {0: 35.74, 1: 36.84, 2: 38.37}, 'A': {0: 8.34, 1: '2.83%', 2: 10.55}, 'C': {0: '6.63%', 1: '5.29%', 2: 3.6}} df = pd.DataFrame(data_dict)
需求
将除id列外,所有带%后缀的数值转换为原数值×10000,最后将这些列统一转为数值类型。
原遍历实现
cols = df.columns[1:] for index, row in df.loc[:, df.columns != 'id'].iterrows(): for c in cols: if str(row[c]).endswith('%'): data_value = str(row[c]) data_value = data_value.replace('%',"") df.at[index,c]= float(data_value) * 10000 # 转换为数值类型 df[cols[1:]] = df[cols[1:]].apply(pd.to_numeric, errors='coerce')
疑问
是否存在无需遍历行的更简便转换方法?
更简便的矢量化实现方法
Pandas的核心优势是矢量化操作,完全可以替代低效的逐行遍历,下面提供两种高效实现:
方法一:矢量化字符串操作 + 条件赋值
import pandas as pd # 复制原数据避免修改源DataFrame df_processed = df.copy() # 定义需要处理的列(排除id) target_cols = df_processed.columns.drop('id') for col in target_cols: # 筛选出当前列中带%的行 percent_mask = df_processed[col].astype(str).str.endswith('%') # 提取数值、转换类型并乘以10000 df_processed.loc[percent_mask, col] = ( df_processed.loc[percent_mask, col] .astype(str) .str.replace('%', '') .astype(float) * 10000 ) # 统一将目标列转为数值类型 df_processed[target_cols] = df_processed[target_cols].apply(pd.to_numeric, errors='coerce')
方法二:applymap批量处理元素
import pandas as pd def convert_value(x): # 判断是否是带%的字符串 if isinstance(x, str) and x.endswith('%'): return float(x.replace('%', '')) * 10000 return x df_processed = df.copy() target_cols = df_processed.columns.drop('id') # 对目标列的每个元素应用转换函数 df_processed[target_cols] = df_processed[target_cols].applymap(convert_value) # 统一转为数值类型 df_processed[target_cols] = df_processed[target_cols].apply(pd.to_numeric, errors='coerce')
优势对比
- 性能更优:
iterrows()逐行处理的效率极低,数据量越大差距越明显;矢量化操作基于numpy底层实现,计算速度提升显著。 - 代码更简洁:无需嵌套循环,逻辑清晰,后期维护成本更低。
- 符合Pandas设计理念:批量处理是Pandas的核心能力,矢量化操作能最大化利用其特性。
内容的提问来源于stack exchange,提问作者kitchenprinzessin
相关产品推荐
相关产品推荐

