Python处理泰坦尼克号数据集时出现AttributeError: 'str'无name属性如何解决
错误排查与解决方案
错误原因
- 核心原因:你直接对单个DataFrame类型的
titanic变量执行for dataset in titanic遍历操作时,pandas默认迭代返回的是DataFrame的列名字符串,而非你预期的子数据集,因此循环内得到的dataset是字符串,调用.Name/.name属性自然触发AttributeError。 - 额外问题:从报错日志可以看到你实际执行的代码里写的是小写的
.name,而泰坦尼克号公开数据集的姓名字段是首字母大写的Name,列名区分大小写,就算遍历对象正确,写小写也会触发属性错误。 - 潜在问题:如果你原本是想同时处理训练集、测试集两个数据集,那你没有先将两个DataFrame存入列表再赋值给
titanic,同时后续统计交叉表、生存率的代码直接对列表类型的titanic做索引也会触发报错。
解决方案
场景1:需要同时处理训练集+测试集两个数据集
先修正变量定义,再调整后续统计的调用对象:
import pandas as pd # 第一步:先读取数据集,将两个数据集存入列表后赋值给titanic train_df = pd.read_csv("train.csv") test_df = pd.read_csv("test.csv") titanic = [train_df, test_df] # 第二步:批量提取Title特征,注意列名是首字母大写的Name for dataset in titanic: dataset['Title'] = dataset.Name.str.extract('([A-Za-z]+)\.', expand=False) # 第三步:统计交叉表,用带标签的训练集统计 print(pd.crosstab(train_df['Title'], train_df['Sex'])) # 第四步:合并稀有头衔 for dataset in titanic: dataset['Title'] = dataset['Title'].replace([ 'Lady', 'Countess', 'Capt', 'Col','Don', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona', 'Dr'], 'Rare') dataset['Title'] = dataset['Title'].replace(['Mlle', 'Ms'], 'Miss') dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs') # 第五步:统计不同头衔的生存率,仅能使用带Survived字段的训练集 print(train_df[['Title', 'Survived']].groupby(['Title'], as_index=False).mean())
场景2:仅处理单个训练集数据
无需循环,直接在DataFrame上操作即可:
import pandas as pd titanic = pd.read_csv("train.csv") # 提取Title特征,注意列名是首字母大写的Name titanic['Title'] = titanic.Name.str.extract('([A-Za-z]+)\.', expand=False) print(pd.crosstab(titanic['Title'], titanic['Sex'])) # 合并稀有头衔 titanic['Title'] = titanic['Title'].replace([ 'Lady', 'Countess', 'Capt', 'Col','Don', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona', 'Dr'], 'Rare') titanic['Title'] = titanic['Title'].replace(['Mlle', 'Ms'], 'Miss') titanic['Title'] = titanic['Title'].replace('Mme', 'Mrs') # 统计生存率 print(titanic[['Title', 'Survived']].groupby(['Title'], as_index=False).mean())
内容的提问来源于stack exchange,提问作者Nafida Aprilia
相关产品推荐
相关产品推荐

