在Pandas中按姓名与地区分组,用mode填充缺失值
按姓名+地区分组,用众数填充缺失值
以下是使用Python Pandas实现需求的完整方案,重点处理Tom+UK组的缺失值填充:
原始数据集
| Name | location | Value |
|---|---|---|
| Tom | USA | 20 |
| Tom | UK | NaN |
| Tom | USA | NaN |
| Tom | UK | 20 |
| Jack | India | NaN |
| Nihal | Africa | 30 |
| Tom | UK | NaN |
| Tom | UK | 20 |
| Tom | UK | 30 |
| Tom | UK | 20 |
| Tom | UK | 30 |
| Sam | UK | 30 |
| Sam | UK | 30 |
实现步骤
1. 加载数据
首先将数据集转为Pandas DataFrame:
import pandas as pd import numpy as np data = { 'Name': ['Tom', 'Tom', 'Tom', 'Tom', 'Jack', 'Nihal', 'Tom', 'Tom', 'Tom', 'Tom', 'Tom', 'Sam', 'Sam'], 'location': ['USA', 'UK', 'USA', 'UK', 'India', 'Africa', 'UK', 'UK', 'UK', 'UK', 'UK', 'UK', 'UK'], 'Value': [20, np.nan, np.nan, 20, np.nan, 30, np.nan, 20, 30, 20, 30, 30, 30] } df = pd.DataFrame(data)
2. 分组填充逻辑
定义函数按组计算众数并填充缺失值,处理多众数的情况(取第一个众数):
def fill_group_mode(group): # 获取组内Value的众数,若存在则取第一个,否则保留NaN mode = group['Value'].mode() fill_val = mode.iloc[0] if not mode.empty else np.nan group['Value'] = group['Value'].fillna(fill_val) return group # 按Name和location分组后应用填充 df_filled = df.groupby(['Name', 'location'], group_keys=False).apply(fill_group_mode)
3. 验证Tom+UK组的填充结果
查看Tom+UK组的填充后数据:
print(df_filled[(df_filled['Name'] == 'Tom') & (df_filled['location'] == 'UK')])
输出:
Name location Value 1 Tom UK 20.0 3 Tom UK 20.0 6 Tom UK 20.0 7 Tom UK 20.0 8 Tom UK 30.0 9 Tom UK 20.0 10 Tom UK 30.0
Tom+UK组中20出现3次,是出现次数最多的值,所有NaN均被填充为20。
4. 完整填充结果
print(df_filled)
输出:
Name location Value 0 Tom USA 20.0 1 Tom UK 20.0 2 Tom USA 20.0 3 Tom UK 20.0 4 Jack India NaN # 该组无有效数据,无法计算众数 5 Nihal Africa 30.0 6 Tom UK 20.0 7 Tom UK 20.0 8 Tom UK 30.0 9 Tom UK 20.0 10 Tom UK 30.0 11 Sam UK 30.0 12 Sam UK 30.0
关键说明
- 对于存在多个众数的组,代码默认取第一个众数进行填充;若需要自定义逻辑,可修改
fill_group_mode函数。 - 无有效非缺失值的组(如Jack+India),缺失值会保留NaN,因为无法计算众数。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

