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

基于Pandas现有列创建分类列时遇ValueError问题求助

问题

我是一名处理手术数据的医生,我的DataFrame中有一列ADMIMETH(入院方式),该列包含多个编码,可分为急诊(17种编码)和非急诊(3种编码)两类。我希望通过筛选该列创建一个包含'emergency'、'non-emergency'分类的新列,于是编写了分类函数并通过apply方法应用到该列:

emerg = ['2A', '2B', '2C', '2D', '2C', '28', '31', '32', '21', '22', '23', '24', '25', '2A', '2B', '2C', '2D']
nonemerg = ['11', '12', '13']
def filter(x):
    if df['ADMIMETH'].isin(emerg):
        return 'acute'
    if df['ADMIMETH'].isin(nonemerg):
        return 'elective'
df['new_col'] = df['ADMIMETH'].apply(filter)

执行后出现如下错误:

File ~/Library/Python/3.9/lib/python/site-packages/pandas/_libs/lib.pyx:2918, in pandas._libs.lib.map_infer()

Cell In [7], line 2, in filter(x)
      1 def filter(x):
----> 2     if df['ADMIMETH'].isin(emerg):
      3         return 'acute'
      4     if df['ADMIMETH'].isin(nonemerg):

File ~/Library/Python/3.9/lib/python/site-packages/pandas/core/generic.py:1527, in NDFrame.__nonzero__(self)
   1525 @final
   1526 def __nonzero__(self) -> NoReturn:
-> 1527     raise ValueError(
   1528         f"The truth value of a {type(self).__name__} is ambiguous. "
   1529         "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1530     )

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
解决方法

错误原因

你写的filter函数里,每次判断都调用了整个df['ADMIMETH']列,而apply是对列中的单个值逐行处理,这样会返回一整列布尔值,没法直接用在if条件里,所以触发了报错。

修正后的简单代码

修改filter函数,用传入的x(当前行的入院编码)来做判断:

emerg = ['2A', '2B', '2C', '2D', '2C', '28', '31', '32', '21', '22', '23', '24', '25', '2A', '2B', '2C', '2D']
nonemerg = ['11', '12', '13']
# 先给急诊编码去重,避免重复判断(可选,运行更高效)
emerg = list(set(emerg))

def filter(x):
    if x in emerg:
        return 'emergency'
    elif x in nonemerg:
        return 'non-emergency'
    else:
        return 'unknown'  # 处理不在两类里的特殊编码,可选

df['new_col'] = df['ADMIMETH'].apply(filter)

更简洁的写法(无需自定义函数)

如果不想写函数,用numpy.where一行就能完成分类:

import numpy as np

emerg = list(set(['2A', '2B', '2C', '2D', '2C', '28', '31', '32', '21', '22', '23', '24', '25', '2A', '2B', '2C', '2D']))
nonemerg = ['11', '12', '13']

df['new_col'] = np.where(df['ADMIMETH'].isin(emerg), 'emergency', 
                         np.where(df['ADMIMETH'].isin(nonemerg), 'non-emergency', 'unknown'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:37