基于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
相关产品推荐
相关产品推荐

