多DataFrame应用自定义赋值函数未生效,寻求排查解决方案
问题分析与修正方案
原代码的核心问题
- 函数定义在循环内部,且逻辑错误:使用
==(比较运算符)而非=(赋值运算符),除else分支外无有效返回值,导致apply无法生成预期结果。 - 循环结构错误:
file.apply(...)代码写在循环外部,仅会处理列表中最后一个DataFrame,前面的DataFrame完全没被处理。 - 逻辑运算符误用:逐行判断时用了位运算符
&,应替换为逻辑运算符and;若用矢量化操作则需用&并给每个条件单独加括号。 - 列赋值逻辑错误:三个目标列都调用同一个
func,但函数逻辑是针对不同列的,这种方式无法实现分栏赋值的需求。
修正方案1:修复apply方式的代码
将函数移到循环外,调整逻辑为根据ranking值返回对应列的内容,一次性生成三个目标列:
import pandas as pd def process_ranking(row): # 初始化三个列为空字符串 high = '' avg = '' low = '' rank = row['ranking'] if rank < 100: high = rank elif 100 <= rank < 200: avg = rank elif 200 <= rank < 300: low = rank # 返回对应列的取值,匹配目标列顺序 return pd.Series([high, avg, low], index=['High Performance', 'Average', 'Low Performance']) # 遍历所有DataFrame执行处理 for df in tests: df[['High Performance', 'Average', 'Low Performance']] = df.apply(process_ranking, axis=1)
修正方案2:更高效的矢量化操作(推荐)
pandas的矢量化操作比apply性能高得多,适合处理大数据量:
for df in tests: # 先初始化所有目标列为空字符串 df['High Performance'] = '' df['Average'] = '' df['Low Performance'] = '' # 通过布尔索引精准赋值 df.loc[df['ranking'] < 100, 'High Performance'] = df['ranking'] df.loc[(df['ranking'] >= 100) & (df['ranking'] < 200), 'Average'] = df['ranking'] df.loc[(df['ranking'] >= 200) & (df['ranking'] < 300), 'Low Performance'] = df['ranking']
额外注意事项
- 确保每个DataFrame都存在
ranking列,若列名不一致需同步修改代码。 - 若
ranking是字符串类型,需先转换为数值类型:df['ranking'] = pd.to_numeric(df['ranking'], errors='coerce')
内容的提问来源于stack exchange,提问作者user18708380
相关产品推荐
相关产品推荐

