Pandas GroupBy对字符串列执行min/max聚合报错求助
问题解决:按分组获取字符串列的最大最小值
问题场景
现有如下DataFrame:
Employee_id REGIONAL_GROUPING 0 5035496 WEST I 1 5035496 WEST I 2 5035496 TN II
需要按Employee_id分组后,获取REGIONAL_GROUPING列的最大值和最小值,预期输出:
Employee_id max_REGIONAL_GROUPING min_REGIONAL_GROUPING 0 5035496 WEST I TN II
尝试的代码及错误
执行以下代码时出现报错:
df.groupby('Employee_id').agg({'REGIONAL_GROUPING': ['min', 'max']})
错误信息:
File ~\Miniconda3\lib\site-packages\pandas\core\nanops.py:1043, in _nanminmax.<locals>.reduction(values, axis, skipna, mask) 1041 result = np.nan 1042 else: -> 1043 result = getattr(values, meth)(axis) 1045 result = _maybe_null_out(result, axis, mask, values.shape) 1046 return result File ~\Miniconda3\lib\site-packages\numpy\core\_methods.py:44, in _amin(a, axis, out, keepdims, initial, where) 42 def _amin(a, axis=None, out=None, keepdims=False, 43 initial=_NoValue, where=True): ---> 44 return umr_minimum(a, axis, None, out, keepdims, initial, where) TypeError: '<=' not supported between instances of 'str' and 'float'
错误原因
报错核心是REGIONAL_GROUPING列中存在字符串和float类型混合的情况(通常是存在NaN值,因为NaN在pandas里属于float类型),导致执行min/max聚合时,无法对字符串和float做大小比较。
解决方案
方案1:先清理空值,再聚合
先把列中的NaN替换成不影响排序的字符串,再执行分组聚合:
import pandas as pd # 替换NaN为特定字符串(可根据业务需求调整) df['REGIONAL_GROUPING'] = df['REGIONAL_GROUPING'].fillna('') # 执行聚合并重置索引 result = df.groupby('Employee_id').agg( max_REGIONAL_GROUPING=('REGIONAL_GROUPING', 'max'), min_REGIONAL_GROUPING=('REGIONAL_GROUPING', 'min') ).reset_index()
方案2:自定义聚合函数处理类型
通过lambda函数先过滤空值并统一转为字符串,再取min/max:
import pandas as pd result = df.groupby('Employee_id').agg( max_REGIONAL_GROUPING=('REGIONAL_GROUPING', lambda x: max([str(v) for v in x if pd.notna(v)])), min_REGIONAL_GROUPING=('REGIONAL_GROUPING', lambda x: min([str(v) for v in x if pd.notna(v)])) ).reset_index()
方案3:过滤空行后聚合
如果业务允许丢弃含空值的行,可先过滤再聚合:
result = df.dropna(subset=['REGIONAL_GROUPING']).groupby('Employee_id').agg( max_REGIONAL_GROUPING=('REGIONAL_GROUPING', 'max'), min_REGIONAL_GROUPING=('REGIONAL_GROUPING', 'min') ).reset_index()
验证结果
执行上述任意方案后,均可得到预期输出:
Employee_id max_REGIONAL_GROUPING min_REGIONAL_GROUPING 0 5035496 WEST I TN II
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

