Pandas列应用函数报错:'int'对象无'MNM_MOBILE_NUMBER'属性
解决Pandas apply时的AttributeError错误
错误原因
你调用vanity_class['MNM_MOBILE_NUMBER'].apply(vanity_def)时,apply会将列中的单个整数号码逐个传入vanity_def函数,但你的函数是按照接收整个DataFrame的逻辑编写的,试图访问vanity_class.MNM_MOBILE_NUMBER属性——整数对象自然没有这个属性,因此报错。
解决方法1:修改函数适配单个元素
将函数改为接收单个号码(整数类型),转成字符串后匹配正则,返回对应的分类结果:
import re def vanity_def(number): num_str = str(number) # 判断Diamond类别的所有模式 if (re.match(r'^5(\d)\1{7}', num_str) or re.match(r'^5(?!(\d)\1)\d(\d)\2{6}$', num_str) or re.match(r'.{2}(?!(\d)\1)\d(\d)\2{5}$', num_str) or re.match(r'^\d*(\d)(\d)(?:\1\2){3}\d*$', num_str) or re.match(r'^5((\d)\2{3})((\d)\4{3})$', num_str) or re.match(r'.{3}(1234567$)', num_str)): return 'Diamond' # 判断Gold类别的所有模式 elif (re.match(r'.{3}(?!(\d)\1)\d(\d)\2{4}$', num_str) or re.match(r'^(?!(\d)\1)\d((\d)\3{6})(?!\3)\d$', num_str) or re.match(r'\d(\d)\1(\d)\2(\d)\3(\d)\4', num_str)): return 'Gold' else: return 'Non Classified'
然后重新执行apply:
vanity_class['MNC_New_Class'] = vanity_class['MNM_MOBILE_NUMBER'].apply(vanity_def)
解决方法2:使用向量化处理(推荐)
Pandas的向量化字符串方法比逐元素apply效率更高,结合numpy.select可以批量处理所有条件:
import numpy as np # 先将号码列转为字符串类型 vanity_class['num_str'] = vanity_class['MNM_MOBILE_NUMBER'].astype(str) # 定义Diamond类别的所有匹配条件 diamond_conditions = [ vanity_class['num_str'].str.match(r'^5(\d)\1{7}'), vanity_class['num_str'].str.match(r'^5(?!(\d)\1)\d(\d)\2{6}$'), vanity_class['num_str'].str.match(r'.{2}(?!(\d)\1)\d(\d)\2{5}$'), vanity_class['num_str'].str.match(r'^\d*(\d)(\d)(?:\1\2){3}\d*$'), vanity_class['num_str'].str.match(r'^5((\d)\2{3})((\d)\4{3})$'), vanity_class['num_str'].str.match(r'.{3}(1234567$)') ] # 定义Gold类别的所有匹配条件 gold_conditions = [ vanity_class['num_str'].str.match(r'.{3}(?!(\d)\1)\d(\d)\2{4}$'), vanity_class['num_str'].str.match(r'^(?!(\d)\1)\d((\d)\3{6})(?!\3)\d$'), vanity_class['num_str'].str.match(r'\d(\d)\1(\d)\2(\d)\3(\d)\4') ] # 按优先级赋值:Diamond > Gold > Non Classified vanity_class['MNC_New_Class'] = np.select( [np.any(diamond_conditions, axis=0), np.any(gold_conditions, axis=0)], ['Diamond', 'Gold'], default='Non Classified' ) # 删除临时字符串列(可选) vanity_class.drop('num_str', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者Leena
相关产品推荐
相关产品推荐

