Pandas中基于双条件分组并用众数填充缺失值问题
问题需求
对数据集中Product1为A且Product2为B的行进行分组,针对该分组内Value列的缺失值,使用组内众数进行填充。
原始数据集
| Product1 | Product2 | Value |
|---|---|---|
| A | B | 10 |
| A | B | NaN |
| A | B | 10 |
| A | C | 20 |
| B | B | 30 |
| A | B | NaN |
预期输出
| Product1 | Product2 | Value |
|---|---|---|
| A | B | 10 |
| A | B | 10 |
| A | B | 10 |
| A | C | 20 |
| B | B | 30 |
| A | B | 10 |
尝试的错误代码
data['Value'] = np.where((data['Product1'] =='A') & (data['Product2'] =='B'),merged['Value'].fillna(data['value'].mode()[0]),data['value'])
问题分析与正确解法
这段尝试代码存在多处问题:
- 变量名大小写不一致:混用了
Value和value(Python对大小写敏感) - 无意义引用
merged变量,且未针对目标分组计算组内众数,错误使用了全数据集的众数
方法一:直接定位填充(高效简洁)
import pandas as pd import numpy as np # 计算目标分组的Value列众数 target_group_mode = data[(data['Product1'] == 'A') & (data['Product2'] == 'B')]['Value'].mode()[0] # 仅对目标分组内的缺失值进行填充 data.loc[(data['Product1'] == 'A') & (data['Product2'] == 'B') & data['Value'].isna(), 'Value'] = target_group_mode
方法二:分组批量处理(扩展性强)
如果后续需要对多组执行类似填充逻辑,推荐用分组处理:
def fill_group_mode(group): # 仅对指定分组执行众数填充 if group['Product1'].iloc[0] == 'A' and group['Product2'].iloc[0] == 'B': group['Value'] = group['Value'].fillna(group['Value'].mode()[0]) return group # 按Product1和Product2分组处理 data = data.groupby(['Product1', 'Product2'], group_keys=False).apply(fill_group_mode)
代码说明
- 方法一直接定位目标分组的缺失值,用预计算的组内众数填充,执行效率更高
- 方法二通过分组逻辑处理,可灵活扩展到其他分组的填充需求
内容的提问来源于stack exchange,提问作者Mathew John
相关产品推荐
相关产品推荐

