按Total_Stops分组用均值填充Price空值报错,求解决
解决AttributeError: 'float' object has no attribute 'fillna'问题
错误根源很明确:当你用df.apply(fun1, axis=1)时,传入函数fun1的x是DataFrame的单行数据,此时x['Price']是单个float类型的值(不是Series对象),而fillna是pandas的Series/DataFrame专属方法,单个数值自然没有这个属性,所以触发报错。
方案1:修改原函数,直接判断并替换空值
既然x['Price']是单个值,那就直接判断它是否为空,再返回对应填充值即可,同时修正原函数的缩进错误:
import pandas as pd def fun1(x): # 先判断Price是否为空 if pd.isna(x['Price']): if x['Total_Stops'] == 'non-stop': return 5024.90 elif x['Total_Stops'] == '1 stop': return 10594.12 elif x['Total_Stops'] == '2 stops': return 12712.36 elif x['Total_Stops'] == '3 stops': return 13112 elif x['Total_Stops'] == '4 stops': return 17686 else: return x['Price'] # Price不为空时直接返回原值 else: return x['Price'] df['Price'] = df.apply(fun1, axis=1)
方案2:用分组填充(更高效的pandas风格写法)
逐行apply效率较低,尤其是处理大数据集时,推荐用groupby结合映射字典来批量填充:
# 先定义Total_Stops对应填充均值的映射字典 stop_price_map = { 'non-stop': 5024.90, '1 stop': 10594.12, '2 stops': 12712.36, '3 stops': 13112, '4 stops': 17686 } # 按Total_Stops分组后,对每组的Price列填充对应均值 df['Price'] = df.groupby('Total_Stops')['Price'].apply( lambda s: s.fillna(stop_price_map[s.name]) )
这种方法利用pandas的向量化操作,比逐行apply快得多,代码也更简洁。
内容的提问来源于stack exchange,提问作者user22606092
相关产品推荐
相关产品推荐

