You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于rest_type列随机填充pandas中dish_liked列的NaN值?

按分组填充NaN值为对应组Top5热门菜品

实现步骤

我们可以用Pandas结合Numpy完成这个需求,核心是先按rest_type分组统计热门菜品,再对每组的NaN值随机填充对应Top5取值:

  1. 统计每个分组的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个,会自动取所有存在的菜品作为候选。

  2. 定义分组填充函数
    编写函数,对每个分组的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
    
  3. 应用填充函数到数据集
    按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:05:30