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

Pandas生成zone列时触发AttributeError错误求助

解决Pandas apply函数中AttributeError: 'str' object has no attribute 'isin'错误

问题背景

需要基于地址多列数据,为Pandas DataFrame新增名为zone的列,实现分区规则映射。现有样本数据、分区规则列表、实现函数,但调用apply时出现错误。

样本数据

Shipping City   Shipping Zip    State   DISTRICT NAME
Garden City     11530           NY      NEW YORK 2
San Francisco   94117           CA      CALIFORNIA 1
Frisco          75036           TX      TEXAS 1
Las Vegas       89139           NV      NV-UT
Beverly Hills   90212           CA      CALIFORNIA 5

预期结果

Shipping City   | Shipping Zip  | State | DISTRICT NAME | Zone  
-----               | -----         | ----- | -----         | ----- 
Garden City         | 11530         | NY    | NEW YORK 2    | zone_8    
San Francisco       | 94117         | CA    | CALIFORNIA 1  | zone_3    
Frisco              | 75036         | TX    | TEXAS 1       | zone_6    
Las Vegas           | 89139         | NV    | NV-UT         | zone_2    
Beverly Hills       | 90212         | CA    | CALIFORNIA 5  | zone_2    

分区规则列表

zone8_state = ['ME', 'NH', 'VT', 'MA', 'RI', 'CT', 'AA', 'HI', 'NY', 'PA', 'NJ', 'MD', 'DE', 'WV', 'OH', 'VA', 'NC', 'SC', 'GA', 'FL', 'MI']
zone7_state = ['KY', 'IN', 'IL', 'WI', 'MN', 'TN', 'AL','LA', 'MS', 'AR']
zone6_state = ['IA', 'MO', 'ND', 'SD', 'NE', 'KS', 'OK', 'TX']
zone5_state = ['MT', 'WV', 'CO', 'NM', 'ID', 'WA', 'OR']
zone4_state = ['UT', 'NV', 'AZ']
norcal = ['CALIFORNIA 1', 'CALIFORNIA 2']
socal = ['CALIFORNIA 4', 'CALIFORNIA 5']
zone3_city = ['CALIFORNIA 3', 'Las Vegas', 'Phoenix']

原错误代码

def get_zones(sample_df):
    if sample_df['State'].isin(zone8_state):
        return 'zone_8'
    elif sample_df['State'].isin(zone7_state):
        return 'zone_7'
    elif sample_df['State'].isin(zone6_state):
        return 'zone_6'
    elif sample_df['State'].isin(zone5_state):
        return 'zone_5'
    elif sample_df['State'].isin(zone4_state) | sample_df['DISTRICT NAME'].isin(norcal):
        return 'zone_4'
    elif sample_df['DISTRICT NAME'].isin(zone3_city) | sample_df['Shipping City'].isin(zone3_city):
        return 'zone_3'
    elif sample_df['DISTRICT NAME'].isin(socal):
        return 'zone_2'
    else:
        return 'check the record'

# 调用代码
sample_df['zone'] = sample_df.apply(get_zones, axis=1)

错误信息

AttributeError: 'str' object has no attribute 'isin'

错误原因

使用apply(axis=1)时,传入函数的参数是单行数据(Pandas Series对象),此时sample_df['State']返回的是单个字符串值,而isin()是Pandas Series/DataFrame的专属方法,字符串对象没有这个方法,因此触发报错。

修正后的代码

将所有isin()替换为Python原生的in关键字,同时把位运算符|替换为布尔运算符or(适配单个布尔值判断场景):

def get_zones(row):
    if row['State'] in zone8_state:
        return 'zone_8'
    elif row['State'] in zone7_state:
        return 'zone_7'
    elif row['State'] in zone6_state:
        return 'zone_6'
    elif row['State'] in zone5_state:
        return 'zone_5'
    elif row['State'] in zone4_state or row['DISTRICT NAME'] in norcal:
        return 'zone_4'
    elif row['DISTRICT NAME'] in zone3_city or row['Shipping City'] in zone3_city:
        return 'zone_3'
    elif row['DISTRICT NAME'] in socal:
        return 'zone_2'
    else:
        return 'check the record'

# 调用代码不变
sample_df['zone'] = sample_df.apply(get_zones, axis=1)

验证结果

运行修正后的代码后,DataFrame将生成符合预期的zone列,与给定的预期结果完全匹配。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:14:59