- Titanic data
本教程使用泰坦尼克号数据集,它以 CSV 格式存储。该数据包含以下数据列:
PassengerId:每位乘客的 ID。
Survived:乘客是否存活的指示。
0表示生存,1表示死亡。Pclass:3 个票务等级之一:
1等、2等和3等。Name:乘客姓名。
Sex:乘客性别。
Age:乘客年龄(以年为单位)。
SibSp:船上兄弟姐妹或配偶的数量。
Parch:船上父母或子女的数量。
Ticket:乘客的票号。
Fare:指示票价。
Cabin:乘客的客舱号。
Embarked:登船港口。
如何处理文本数据#
将所有名字字符转换为小写。
要将
Name列中的每个字符串转换为小写,请选择Name列(参见 tutorial on selection of data ),添加str访问器并应用lower方法。这样,每个字符串都会被逐元素转换。
与 time series tutorial 中的 datetime 对象拥有 dt 访问器类似,使用 str 访问器时,也有许多专门的字符串方法可用。这些方法通常名称与等效的内置单个元素字符串方法匹配,但它们是逐元素应用的(还记得 element-wise calculations 吗?),作用于列中的每个值。
创建一个新列
Surname,通过提取逗号前的部分来包含乘客的姓氏。使用
Series.str.split()方法,每个值都会被返回为一个包含 2 个元素的列表。第一个元素是逗号前的部分,第二个元素是逗号后的部分。由于我们只对代表姓氏的第一部分(元素 0)感兴趣,所以我们可以再次使用
str访问器并应用Series.str.get()来提取相关部分。确实,这些字符串函数可以级联起来以一次性组合多个函数!
更多关于提取字符串部分的信息,请参见用户指南中关于 splitting and replacing strings 的部分。
提取泰坦尼克号上女伯爵的乘客数据。
(对她的故事感兴趣?请参见 Wikipedia !)
字符串方法
Series.str.contains()检查列Name中的每个值是否包含单词Countess,并为每个值返回True``(``Countess是名称的一部分)或False``(``Countess不是名称的一部分)。此输出可用于使用 subsetting of data tutorial 中介绍的条件(布尔)索引来子选择数据。由于泰坦尼克号上只有一位女伯爵,因此我们得到一行结果。
备注
支持更强大的字符串提取,因为 Series.str.contains() 和 Series.str.extract() 方法接受 regular expressions ,但这超出了本教程的范围。
有关提取字符串部分的信息,请参阅用户指南中的 string matching and extracting 部分。
泰坦尼克号上的哪个乘客名字最长?
要获得最长的名字,我们首先需要获取
Name列中每个名字的长度。通过使用 pandas 字符串方法,Series.str.len()函数会应用于每个名字(逐个元素)。接下来,我们需要获取表中名字长度最大的对应位置,最好是索引标签。
idxmax()方法正好能做到这一点。它不是一个字符串方法,而是应用于整数,因此不使用str。根据行的索引名称(
307)和列(Name),我们可以使用 tutorial on subsetting 中介绍的loc运算符进行选择。
在 “Sex” 列中,将 “male” 的值替换为 “M”,将 “female” 的值替换为 “F”。
虽然
replace()不是一个字符串方法,但它提供了一种便捷的方式来使用映射或词汇表来翻译某些值。它需要一个dictionary来定义映射{from : to}。
警告
还有一个 replace() 方法可用于替换特定字符集。但是,当有一个包含多个值的映射时,这会变成:
titanic["Sex_short"] = titanic["Sex"].str.replace("female", "F")
titanic["Sex_short"] = titanic["Sex_short"].str.replace("male", "M")
这将变得很麻烦,并且很容易出错。只需考虑(或自己尝试)这两个语句顺序相反时会发生什么……
REMEMBER
字符串方法可通过
str访问器使用。字符串方法是逐个元素工作的,可用于条件索引。
replace方法是一种根据给定字典转换值的便捷方法。
用户指南页面 working with text data 提供了完整概述。