使用df.at无法修改DataFrame的值 字典值为列表对象时赋值失败
问题根因
- 赋值目标为列表这类非标量可迭代对象时,Pandas默认会尝试拆分可迭代对象匹配多列/多行赋值规则,导致单个列表无法直接存入单个单元格,出现静默赋值失败。
iterrows()返回的行是原DataFrame的副本,基于该副本的行索引配合at赋值非标量时,容易出现写入失效的问题。
解决方法
方法1:修改循环内的赋值逻辑
在赋值时明确指定存入的是单个对象,仅修改赋值行即可:
for i,row in df.iterrows() : if row['B'] == 'nan': key = row['A'] # 明确标记要存入的是单个列表对象,避免被自动拆分 df.at[i,'B'] = [d1[key]][0]
也可以用df.iat[i, df.columns.get_loc('B')] = d1[key]实现相同效果。
方法2:用向量化操作替代循环(更推荐)
避免iterrows的性能问题和赋值风险,直接用Pandas内置方法实现需求,代码更简洁高效:
# 筛选B列为'nan'的行,用A列的值匹配d1映射后直接赋值 df.loc[df['B'] == 'nan', 'B'] = df.loc[df['B'] == 'nan', 'A'].map(d1)
以上两种方法运行后均可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者Akshay Tarpara
相关产品推荐
相关产品推荐

