遍历Pandas DataFrame修改值无效,使用df.at仍无法解决求助
问题:无法修改Pandas DataFrame中的值?
尝试修改DataFrame数据时,即便用了df.at方法,目标值还是没变化,代码如下:
HOUSING_PATH = "datasets/housing" csv_path = os.path.join(HOUSING_PATH, "property6.csv") housing = pd.read_csv(csv_path) headers = ['Sold Price', 'Longitude', 'Latitude', 'Land Size', 'Total Bedrooms', 'Total Bathrooms', 'Parking Spaces'] # 希望将114行的停车位值(405)改为空值、0或None,因为405不符合逻辑 for index in housing.index: # 获取单元格的总停车位数量 row = housing.at[index, headers[6]] # 如果总停车位大于20 if row > 20: # 改为空值 row = '' print(housing.at[114, headers[6]]) # 输出仍然是405
已确认该列数据类型为<class 'numpy.float64'>,判断语句能正常执行,但就是无法修改值。
原因分析
你犯了典型的赋值逻辑错误:row = housing.at[index, headers[6]]只是把DataFrame单元格的数值复制到了局部变量row中,后续row = ''仅仅修改了这个变量的内容,完全没有对DataFrame本身的数据做任何改动。
解决方案
方案1:循环中直接用.at修改DataFrame
不要把值复制到变量,直接通过.at定位单元格并赋值:
for index in housing.index: parking_val = housing.at[index, headers[6]] if parking_val > 20: # 推荐用pd.NA适配float类型的缺失值,避免列类型变为object housing.at[index, headers[6]] = pd.NA # 如果要设为0,直接写: # housing.at[index, headers[6]] = 0
方案2:用矢量化操作(更高效,推荐)
Pandas不推荐用循环处理数据,用loc做矢量化筛选赋值,速度更快,代码更简洁:
# 筛选出停车位>20的行,直接赋值为pd.NA housing.loc[housing[headers[6]] > 20, headers[6]] = pd.NA # 若要设为0,替换为: # housing.loc[housing[headers[6]] > 20, headers[6]] = 0
注意:因为你的列是float64类型,不要用空字符串''赋值,否则会导致列类型变为object,后续数值计算会出问题。pd.NA是Pandas专为数值类型设计的缺失值标记,能保持列的数值类型。
内容的提问来源于stack exchange,提问作者CountDOOKU
相关产品推荐
相关产品推荐

