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

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):
---&gt; 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:24:14