如何基于rest_type列随机填充pandas中dish_liked列的NaN值?
按分组填充NaN值为对应组Top5热门菜品
实现步骤
我们可以用Pandas结合Numpy完成这个需求,核心是先按rest_type分组统计热门菜品,再对每组的NaN值随机填充对应Top5取值:
统计每个分组的Top5热门菜品
先排除dish_liked列的NaN值,按rest_type分组统计每个菜品的出现频次,取每组频次最高的前5个菜品:import pandas as pd import numpy as np # 假设你的数据集名为df # 计算每个rest_type对应的Top5菜品列表 top_dishes = df.groupby('rest_type')['dish_liked'].agg( lambda x: x.dropna().value_counts().head(5).index.tolist() )这段代码会生成一个Series,索引是
rest_type的各个取值,值为对应组的Top5菜品列表。如果某个组的有效菜品不足5个,会自动取所有存在的菜品作为候选。定义分组填充函数
编写函数,对每个分组的dish_liked列NaN值,从该组的Top5列表中随机选择值填充:def fill_nan_with_top5(group): # 获取当前分组的Top5菜品 group_top5 = top_dishes[group.name] # 填充NaN值:对每个NaN随机选一个Top5菜品 group['dish_liked'] = group['dish_liked'].fillna( lambda _: np.random.choice(group_top5) ) return group应用填充函数到数据集
按rest_type分组后应用上述函数,完成填充:# 得到填充后的数据集 df_filled = df.groupby('rest_type').apply(fill_nan_with_top5)
示例说明
比如针对Dessert Parlor组,假设统计出的Top5菜品是['Ice Cream', 'Chocolate Cake', 'Cheesecake', 'Pastry', 'Brownie'],那么该组内所有dish_liked的NaN值都会随机从这5个选项中挑选填充,保证填充值符合该餐厅类型的热门菜品特征。
特殊情况处理
如果某个rest_type分组的dish_liked全为NaN,x.dropna().value_counts()会返回空,此时可以在函数中加入兜底逻辑:
def fill_nan_with_top5(group): group_top5 = top_dishes.get(group.name, ['Default Dish']) if not group_top5: group_top5 = ['Default Dish'] group['dish_liked'] = group['dish_liked'].fillna( lambda _: np.random.choice(group_top5) ) return group
内容的提问来源于stack exchange,提问作者Vikas Sharma
相关产品推荐
相关产品推荐

