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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:35:20