You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:01:13