You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas循环中用loc/at给列单元格赋值仅内部生效问题排查

问题原因与解决方案

问题诊断

  • 不属于内存不足问题,是典型的pandas链式索引副本修改问题
  • 根因:cont = dfd.loc[dfd["company"] == stock_list_company_name[index]] 这行代码筛选出的cont是dfd的独立副本,并非原dfd的视图,所有对cont的修改都只会作用于副本,不会同步到原dfd,因此最终输出全为初始值0。

最优解决方案(推荐,避免循环,效率提升明显)

直接使用pandas的merge关联逻辑完成匹配赋值,代码如下:

# 1. 构造公司名到ticker的映射字典
company_ticker_map = dict(zip(stock_list_company_name, ticker_list))
# 2. 给dfd新增临时ticker列用于关联
dfd['ticker'] = dfd['company'].map(company_ticker_map)
# 3. 预处理stock_data,保留需要的字段并重命名避免列名冲突
stock_sentiment = stock_data[['ticker', 'date', 'sentiment']].rename(
    columns={'date': 'published_date', 'sentiment': 'matched_sentiment'}
)
# 4. 按ticker和发布日期左关联匹配情绪值
dfd = dfd.merge(stock_sentiment, on=['ticker', 'published_date'], how='left')
# 5. 赋值情绪值,未匹配到的保留原始0值
dfd['sentiment'] = dfd['matched_sentiment'].fillna(0).astype(dfd['sentiment'].dtype)
# 6. 删除临时辅助列
dfd.drop(columns=['ticker', 'matched_sentiment'], inplace=True)

原有循环逻辑的修复方案

如果一定要保留原有循环写法,只需要把修改cont的逻辑改为直接修改原dfd即可,将原代码中:

cont.at[e,"sentiment"] = cont2["sentiment"].values[ix]

替换为:

dfd.at[e,"sentiment"] = cont2["sentiment"].values[ix]

内容的提问来源于stack exchange,提问作者Diego Gallo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 02:06:04