如何用random.choice均匀填充DataFrame指定条件列的空值?
解决DataFrame按条件随机列表填充空值的问题
问题分析
- 第一种方法中
random.choice(top5C)仅执行一次,生成单个固定值,导致所有空值被同一值填充,无法实现随机分配。 - 第二种方法使用
map仅返回处理后的序列,但未将结果赋值回原DataFrame,因此原数据无变化。
可行解决办法
方法1:apply结合赋值修改原数据
直接对目标列执行apply处理,并将结果赋值回原DataFrame的对应位置:
import random import pandas as pd top5 = ['Pasta', 'Waffles', 'Mocktails', 'Coffee', 'BrownieChocolate', 'Burgers'] # 针对rest_type为'Quick Bites'的行,处理dish_liked字段的空值 new_df.loc[new_df['rest_type'] == 'Quick Bites', 'dish_liked'] = new_df.loc[new_df['rest_type'] == 'Quick Bites', 'dish_liked'].apply( lambda x: random.choice(top5) if pd.isnull(x) else x )
核心是将apply的处理结果赋值回原DataFrame的对应列,才能真正修改原数据。
方法2:生成随机列表批量填充
先统计目标区域的空值数量,生成对应长度的随机值列表后批量填充,适合大数据量场景:
import random import pandas as pd top5C = ['Pasta', 'Waffles', 'Mocktails', 'Coffee', 'BrownieChocolate', 'Burgers'] # 筛选出rest_type为Cafe且dish_liked为空的行 mask = (new_df['rest_type'] == 'Cafe') & new_df['dish_liked'].isnull() # 生成与空值数量匹配的随机值列表 random_values = [random.choice(top5C) for _ in range(mask.sum())] # 批量填充空值 new_df.loc[mask, 'dish_liked'] = random_values
这种方式避免逐行处理的开销,效率更高。
补充说明
- 两种方法均能实现每个空值随机选取列表中的值,而非单一值填充。
- 若需固定随机结果,可在代码开头添加
random.seed(123)(数值自定义)来锁定随机种子。
内容的提问来源于stack exchange,提问作者Vikas Sharma
相关产品推荐
相关产品推荐

