为何无法使用loc更新DataFrame的Range列?求排查解决
问题原因及解决办法
核心错误
你这段代码没修改到原DataFrame的原因有两个:
- 你把
newBTC.loc[i, "Range"]的值赋给了局部变量df_column_range,后续修改这个变量只是改了内存里的临时值,根本没同步回原DataFrame。 - 多个
if条件区间重叠(比如-11同时符合第一个和第二个条件),会导致后面的赋值覆盖前面的,逻辑不符合预期。
修复方案
方案1:修正循环逻辑,直接修改原DataFrame
把对局部变量的赋值改成直接操作原DataFrame的对应行,同时把重叠的if改成elif避免重复匹配:
for i, row in newBTC.iterrows(): pct_change = newBTC.loc[i, 'percentchange'] if -100 <= pct_change < -11: # 用开区间避免边界值重复匹配 newBTC.loc[i, "Range"] = -10 elif -11 <= pct_change < -9: newBTC.loc[i, "Range"] = -9 elif -9 <= pct_change < -7: newBTC.loc[i, "Range"] = -8 # 继续补充其他区间的elif逻辑 else: # 处理不满足以上条件的情况,比如保持原值或设默认值 pass
方案2:用pandas矢量化操作(更高效)
pandas不推荐用循环逐行修改,大数据量下效率极低,建议用pd.cut函数批量处理:
# 定义区间边界和对应的Range值 bins = [-100, -11, -9, -7, ...] # 补充你的其他区间上限 labels = [-10, -9, -8, ...] # 对应每个区间的Range值 newBTC['Range'] = pd.cut(newBTC['percentchange'], bins=bins, labels=labels, include_lowest=True)
include_lowest=True会让第一个区间包含左边界(比如-100),确保所有值都能匹配到区间。
内容的提问来源于stack exchange,提问作者user14009897
相关产品推荐
相关产品推荐

