是否有兼具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
最简解决方案
可以通过自定义聚合函数实现需求,逻辑如下:
- 分组后先过滤掉
NaN值 - 如果分组内无有效值(全是
NaN),返回False - 如果分组内所有有效值都相同,返回该值
- 如果分组内有多个不同的有效值,返回
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
相关产品推荐
相关产品推荐

