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
相关产品推荐
相关产品推荐

