如何用Pandas按administ_div、municipality分组并保留有效temp_id
Pandas分组聚合实现需求
问题描述
现有如下DataFrame:
| temp_id | administrative_div | municipality | combine |
|---|---|---|---|
| 1 | Gunma | Maebashi | |
| NaN | Gunma | Maebashi | CC |
| NaN | Gunma | Maebashi | DD |
| NaN | Gunma | Maebashi | EE |
| 2 | Gunma | Kiryu | AA |
需要按administrative_div、municipality分组,保留每组中非NaN的temp_id,将同组combine字段聚合为列表(多值时)或原值(单值时),得到目标结果:
| temp_id | administrative_div | municipality | combine |
|---|---|---|---|
| 1 | Gunma | Maebashi | [CC,DD,EE] |
| 2 | Gunma | Kiryu | AA |
解决方案代码
import pandas as pd import numpy as np # 构造原始DataFrame df = pd.DataFrame({ 'temp_id': [1, np.nan, np.nan, np.nan, 2], 'administrative_div': ['Gunma']*5, 'municipality': ['Maebashi']*4 + ['Kiryu'], 'combine': ['', 'CC', 'DD', 'EE', 'AA'] }) # 定义聚合函数:处理combine字段,空值过滤后转列表或返回单值 def combine_agg(series): # 过滤空字符串和NaN filtered = series[series.notna() & (series != '')].tolist() if len(filtered) == 1: return filtered[0] return filtered # 分组聚合 result_df = df.groupby(['administrative_div', 'municipality'], as_index=False).agg( temp_id=('temp_id', lambda x: x.dropna().iloc[0]), combine=('combine', combine_agg) ) print(result_df)
代码说明
- 构造原始数据:还原题目中的DataFrame,空值对应空字符串和
np.nan。 - 聚合函数
combine_agg:先过滤combine字段里的空字符串和NaN,再根据过滤后的元素数量返回列表或单个值。 - 分组聚合操作:按指定字段分组,
temp_id取每组中非NaN的唯一值;combine用自定义函数完成聚合逻辑。
内容的提问来源于stack exchange,提问作者Jimmy
相关产品推荐
相关产品推荐

