如何修改Pandas DataFrame中特定行的单个字段值
问题描述
我有一个包含多名NFL球员2022年数据的Pandas DataFrame,需要仅将Christian McCaffrey所在行的'Tm'列值从'2TM'改为'SFO',不修改其他行。尝试用iloc定位单行并使用str.replace时,除'Tm'列外其他列全部变为NaN。
DataFrame前10行样例:
Player Tm Age Att Yds TD Y/A Y/G Fmb Age_Rank Att_Rank Yds_Rank TD_Rank Y/A_Rank Y/G_Rank Fmb_Rank 1 Derrick Henry TEN 28.0 349.0 1538.0 13.0 4.4 96.1 6.0 0.90 1.00 0.98 0.97 0.41 0.98 1.00 2 Josh Jacobs LVR 24.0 340.0 1653.0 12.0 4.9 97.2 3.0 0.37 0.98 1.00 0.92 0.69 1.00 0.75 3 Nick Chubb CLE 27.0 302.0 1525.0 12.0 5.0 89.7 1.0 0.76 0.96 0.96 0.92 0.80 0.96 0.36 4 Saquon Barkley NYG 25.0 295.0 1312.0 10.0 4.4 82.0 1.0 0.52 0.94 0.94 0.86 0.41 0.94 0.36 5 Najee Harris PIT 24.0 272.0 1034.0 7.0 3.8 60.8 3.0 0.37 0.92 0.74 0.69 0.12 0.62 0.75 6 Dalvin Cook MIN 27.0 264.0 1173.0 8.0 4.4 69.0 4.0 0.76 0.90 0.90 0.78 0.41 0.84 0.88 7 Jamaal Williams DET 27.0 262.0 1066.0 17.0 4.1 62.7 3.0 0.76 0.88 0.82 1.00 0.27 0.66 0.75 8 Miles Sanders PHI 25.0 259.0 1269.0 11.0 4.9 74.6 2.0 0.52 0.86 0.92 0.88 0.69 0.90 0.60 9 Christian McCaffrey 2TM 26.0 244.0 1139.0 8.0 4.7 67.0 1.0 0.62 0.84 0.88 0.78 0.58 0.82 0.36 10 Ezekiel Elliott DAL 27.0 231.0 876.0 12.0 3.8 58.4 0.0 0.76 0.82 0.60 0.92 0.12 0.54 0.10
错误代码及结果:
print(data_radar_filtered.iloc[8]) # 输出 Player Christian McCaffrey Tm 2TM Age 26.0 Att 244.0 Yds 1139.0 TD 8.0 Y/A 4.7 Y/G 67.0 Fmb 1.0 Age_Rank 0.62 Att_Rank 0.84 Yds_Rank 0.88 TD_Rank 0.78 Y/A_Rank 0.58 Y/G_Rank 0.82 Fmb_Rank 0.36 Name: 8, dtype: object # 错误修改代码 data_radar_filtered.iloc[8] = data_radar_filtered.iloc[8].str.replace('2TM', 'SFO', regex=False) print(data_radar_filtered.iloc[8]) # 输出 Player Christian McCaffrey Tm SFO Age NaN Att NaN Yds NaN TD NaN Y/A NaN Y/G NaN Fmb NaN Age_Rank NaN Att_Rank NaN Yds_Rank NaN TD_Rank NaN Y/A_Rank NaN Y/G_Rank NaN Fmb_Rank NaN Name: 8, dtype: object
错误原因
你用data_radar_filtered.iloc[8].str.replace(...)时,str.replace会对整行的所有列执行字符串替换操作。但该行的Age、Att等列是数值类型,调用字符串方法会返回NaN,导致整行除了原本是字符串的Player和Tm列外,其他列全部变为缺失值。
解决方案
方法1:直接定位目标列修改(按行索引)
通过iloc同时指定行索引和列位置,只修改'Tm'列:
# 获取'Tm'列的索引位置 tm_col_idx = data_radar_filtered.columns.get_loc('Tm') # 修改指定行的'Tm'列 data_radar_filtered.iloc[8, tm_col_idx] = 'SFO'
方法2:按Player名称定位(更可靠)
如果后续DataFrame的行索引可能变化,通过Player名称匹配定位更稳妥,不会因为行位置变动出错:
data_radar_filtered.loc[data_radar_filtered['Player'] == 'Christian McCaffrey', 'Tm'] = 'SFO'
方法3:使用字典更新(适合多列修改场景)
如果需要同时修改多列,可以构造字典指定列名和对应值,用loc更新:
# 获取目标行的索引标签 target_index = data_radar_filtered[data_radar_filtered['Player'] == 'Christian McCaffrey'].index[0] # 构造更新字典 update_dict = {'Tm': 'SFO'} # 更新指定行 data_radar_filtered.loc[target_index] = data_radar_filtered.loc[target_index].replace(update_dict)
以上方法都只会修改目标行的'Tm'列,其他列数据保持不变。
内容的提问来源于stack exchange,提问作者Martin Malek
相关产品推荐
相关产品推荐

