向Pandas DataFrame指定单元格插入值时误删列值的问题排查
问题分析与解决
场景重现
现有DataFrame结构如下:
| alpha | result |
|---|---|
| 0.5 | NaN |
| 1 | 0.89 |
| 1.5 | NaN |
执行以下代码试图给alpha=0.5对应的result单元格赋值0.2:
import pandas as pd df = pd.read_excel(file, engine="openpyxl") df_index = df.index[df['alpha_loss'] == 0.5] df.loc[df_index, 'result'] = 0.2
也曾尝试替换为df.at[df_index, 'result'] = 0.2,结果一致。
原本预期得到:
| alpha | result |
|---|---|
| 0.5 | 0.2 |
| 1 | 0.89 |
| 1.5 | NaN |
但最初误以为result列原有值被清空,实际是因列名拼写错误产生了新列,真实结果为:
| alpha | result | result2 |
|---|---|---|
| 0.5 | NaN | 0.2 |
| 1 | 0.89 | NaN |
| 1.5 | NaN | NaN |
问题根源
核心错误是列名拼写错误:
- 筛选行时使用了不存在的列名
alpha_loss,实际对应列名是alpha; - 同时可能误写了目标列名(比如将
result写成result2),当对不存在的列执行赋值时,pandas会自动新增该列; - 加上
print(df)仅显示最后一列,导致误以为原有result列的值被删除,实际上原列并未被修改。
正确解决方案
方法1:修正列名后赋值
import pandas as pd df = pd.read_excel(file, engine="openpyxl") # 正确筛选alpha等于0.5的行索引 target_index = df.index[df['alpha'] == 0.5] # 对已存在的result列赋值 df.loc[target_index, 'result'] = 0.2
方法2:简化写法,直接定位赋值
df.loc[df['alpha'] == 0.5, 'result'] = 0.2
执行后即可得到预期的DataFrame:
| alpha | result |
|---|---|
| 0.5 | 0.2 |
| 1 | 0.89 |
| 1.5 | NaN |
内容的提问来源于stack exchange,提问作者clusty_dusty
相关产品推荐
相关产品推荐

