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

是否有兼具any与unique特性的Pandas聚合函数?

问题说明

现有数据集如下:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {'A': ['one', 'two', 'two', 'one', 'one', 'three'],
     'B': ['a', 'b', 'c', 'a', 'a', np.nan]})

数据集展示:

A    B
0    one    a
1    two    b
2    two    c
3    one    a
4    one    a
5  three  NaN

使用Pandas的groupby结合any()和unique()得到的结果如下:

  • df.groupby('A')['B'].any():
A
one       True
three    False
two       True
Name: B, dtype: bool
  • df.groupby('A')['B'].unique():
A
one         [a]
three     [nan]
two      [b, c]
Name: B, dtype: object

期望得到的结果为:

A
one           a
three     False
two        True
最简解决方案

可以通过自定义聚合函数实现需求,逻辑如下:

  1. 分组后先过滤掉NaN值
  2. 如果分组内无有效值(全是NaN),返回False
  3. 如果分组内所有有效值都相同,返回该值
  4. 如果分组内有多个不同的有效值,返回True

代码实现

def custom_agg(series):
    non_nan_vals = series.dropna()
    if non_nan_vals.empty:
        return False
    if non_nan_vals.nunique() == 1:
        return non_nan_vals.iloc[0]
    return True

result = df.groupby('A')['B'].agg(custom_agg)
print(result)

执行后输出:

A
one       a
three    False
two      True
Name: B, dtype: object

简化版(lambda表达式)

如果想要更紧凑的写法,可以用lambda表达式整合逻辑:

result = df.groupby('A')['B'].agg(
    lambda x: x.dropna().iloc[0] if x.dropna().nunique() == 1 
              else (False if x.dropna().empty else True)
)

两种方法都能满足需求,自定义函数的写法更易读,适合后续维护;lambda表达式更简洁,适合快速实现。

内容的提问来源于stack exchange,提问作者Anna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:50:16