Python Pandas:如何基于town列条件更新DataFrame的Points列值?
问题场景
给定如下Pandas DataFrame:
import pandas as pd df = pd.DataFrame([['KALLANG/WHAMPOA', '2 ROOM', '01 TO 03', 47.0, 'IMPROVED', 92000.0, 0], ['QUEENSTOWN', '2 ROOM', '01 TO 03', 45.0, 'STANDARD', 185000.0, 0], ['QUEENSTOWN', '2 ROOM', '01 TO 03', 45.0, 'STANDARD', 205500.0, 0], ['TOA PAYOH', '2 ROOM', '01 TO 03', 45.0, 'IMPROVED', 248000.0, 0], ['JURONG WEST', '2 ROOM', '01 TO 03', 44.0, 'MODEL A', 181000.0, 0]], columns=['town', 'flat_type', 'storey_range', 'floor_area_sqm', 'flat_model', 'resale_price', 'Points'])
需要为town == 'QUEENSTOWN'的行,在Points列上加5。尝试执行df[(df['town'] == 'QUEENSTOWN')]['Points']+5后,未成功更新原DataFrame,需正确实现方法。
问题原因
你使用的链式索引df[(df['town'] == 'QUEENSTOWN')]['Points']返回的通常是原DataFrame的临时副本,而非原数据的引用,因此对副本的修改不会同步到原DataFrame中。
正确实现方法
方法1:使用.loc直接修改原DataFrame(推荐)
.loc是Pandas官方推荐的行/列定位方法,可直接修改原数据:
df.loc[df['town'] == 'QUEENSTOWN', 'Points'] += 5
执行后,原DataFrame中QUEENSTOWN对应的Points值会从0变为5。
方法2:使用numpy.where批量赋值
适合批量条件替换场景,生成新列值覆盖原列:
import numpy as np df['Points'] = np.where(df['town'] == 'QUEENSTOWN', df['Points'] + 5, df['Points'])
逻辑:满足条件的行Points加5,不满足的保持原值。
方法3:创建新DataFrame(不修改原数据)
如果需要保留原DataFrame,可使用assign生成新的DataFrame:
new_df = df.assign( Points=lambda x: x['Points'] + 5 if x['town'] == 'QUEENSTOWN' else x['Points'] )
或更直观的apply写法:
new_df = df.assign( Points=df.apply(lambda row: row['Points'] + 5 if row['town'] == 'QUEENSTOWN' else row['Points'], axis=1) )
内容的提问来源于stack exchange,提问作者N_ote
相关产品推荐
相关产品推荐

