为何自定义函数中调用pandas.Series.between会报‘str无between属性’错误?
问题原因及解决思路
问题原因
- 直接调用
df["icd10"].between(...)时,df["icd10"]是pandas Series对象,between是Series的内置方法,因此能正常执行。 - 使用
df.apply(classify_death, axis=1)时,传入函数的row是DataFrame的单行数据(Series类型),但row["icd10"]是单个字符串值,字符串对象没有between方法,所以抛出AttributeError。 - 额外注意:报错代码里写的是
row["dmcaacme"],和你定义的icd10列名不一致,这大概率是笔误导致的额外问题。
解决思路
方案1:优先使用向量式操作(推荐)
pandas的核心优势是向量式运算,效率远高于逐行apply,直接保留你最初的写法即可:
df["copd"] = df["icd10"].between("j40", "j4799").astype(int)
方案2:如果必须用apply(复杂场景)
如果有更复杂的逐行逻辑需要封装,直接用字符串比较替代between(ICD-10编码的字符串排序规则符合区间判断需求):
def classify_death(row): # 注意修正列名,确保和实际数据列一致 copd = 1 if "c00" <= row["icd10"] <= "c9799" else 0 return copd df["copd"] = df.apply(classify_death, axis=1)
方案3:改用numpy.where(简洁向量式替代)
也可以用numpy.where实现条件赋值,效果和between完全一致:
import numpy as np df["copd"] = np.where(df["icd10"].between("j40", "j4799"), 1, 0)
内容的提问来源于stack exchange,提问作者jthompson12
相关产品推荐
相关产品推荐

