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

