如何在Pandas中按指定列分组并按条件聚合含空值的数据?
解决方案
假设你的DataFrame包含类似Name、Subject、Year的列结构,我们可以通过自定义分组处理逻辑实现需求,具体步骤如下:
步骤1:构造示例测试数据
先创建符合需求场景的测试数据集:
import pandas as pd import numpy as np data = { 'Name': ['Alice', 'Alice', 'Bob', 'Bob', 'Charlie', 'Charlie', 'Dave', 'Charlie', 'Charlie'], 'Subject': ['Math', np.nan, np.nan, np.nan, 'English', 'History', np.nan, 'English', 'English'], 'Year': [2020, 2021, 2022, 2023, 2020, 2021, 2024, 2022, 2023] } df = pd.DataFrame(data)
步骤2:编写分组处理函数
自定义函数处理每个分组,根据Subject的空值情况执行对应操作:
def process_group(group): # 检查分组内是否存在非空的Subject值 has_valid_subject = group['Subject'].notna().any() if not has_valid_subject: # 分组内Subject全为空,保留首行数据 return group.head(1) else: # 剔除空Subject行,按Name+Subject分组合并Year列(此处用逗号拼接,可改为list保留原始数值) filtered_group = group[group['Subject'].notna()] aggregated = filtered_group.groupby(['Name', 'Subject'])['Year'].agg(lambda x: ', '.join(map(str, x))).reset_index() return aggregated # 按Name分组执行处理,合并最终结果 final_result = df.groupby('Name', group_keys=False).apply(process_group).reset_index(drop=True)
步骤3:查看处理结果
print(final_result)
输出结果:
Name Subject Year 0 Alice Math 2020 1 Bob NaN 2022 2 Charlie English 2020, 2022, 2023 3 Charlie History 2021 4 Dave NaN 2024
逻辑说明
- 若分组内存在非空Subject(如Alice、Charlie):先过滤掉Subject为空的行,再按
Name+Subject聚合,将同一Subject对应的Year合并为字符串(如需保留原始数值列表,将聚合函数替换为list即可)。 - 若分组内Subject全为空(如Bob):直接保留分组的首行数据。
- 若分组内仅单条空Subject记录(如Dave):因无有效Subject值,自动触发全空逻辑,保留该行。
内容的提问来源于stack exchange,提问作者cyntha
相关产品推荐
相关产品推荐

