如何操作文本数据
来源:Pandas官网:https://pandas.pydata.org/docs/getting_started/intro_tutorials/index.html
笔记托管:https://gitee.com/DingJiaxiong/machine-learning-study
文章目录
- 如何操作文本数据
- 导包
- 数据准备
- 【小结】
导包
import pandas as pd
数据准备
数据介绍: 使用存储为 CSV 的泰坦尼克号数据集。数据由以下数据列组成:
- 【PassengerId】乘客 ID:每位乘客的 ID。
- 【Survived】幸存:表明乘客是否幸存。0 表示是,1 表示否。
- 【Pclass】P类:3个机票类别之一:1类,2类和3类.
- 【Name】姓名:乘客姓名。
- 【Sex】性别:乘客的性别。
- 【Age】年龄:乘客的年龄(以岁为单位)。
- SibSp:船上的兄弟姐妹或配偶的数量。
- Parch:船上的父母或孩子人数。
- 【Ticket】票:乘客的票号。
- 【Fare】票价:表示票价。
- 【Cabin】客舱:乘客的客舱号码。
- 【Embarked】登船:登船港。
titanic = pd.read_csv("titanic.csv")
titanic.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
使所有名称字符小写。
titanic["Name"].str.lower()
0 braund, mr. owen harris
1 cumings, mrs. john bradley (florence briggs th...
2 heikkinen, miss. laina
3 futrelle, mrs. jacques heath (lily may peel)
4 allen, mr. william henry
...
886 montvila, rev. juozas
887 graham, miss. margaret edith
888 johnston, miss. catherine helen "carrie"
889 behr, mr. karl howell
890 dooley, mr. patrick
Name: Name, Length: 891, dtype: object
若要使Name列中的每个字符串都小写,请选择“Name”列,添加 str 访问器并应用 lower 方法。因此,每个字符串都是按元素转换的。
与具有 dt 访问器的时间序列教程中的日期时间对象类似,使用 str 访问器时可以使用许多专用字符串方法。这些方法通常具有与单个元素的等效内置字符串方法匹配的名称,但按元素(还记得按元素计算?)应用于列的每个值。
通过提取逗号前的部分来创建包含乘客姓氏的新列 Surname。
titanic["Name"].str.split(",")
0 [Braund, Mr. Owen Harris]
1 [Cumings, Mrs. John Bradley (Florence Briggs ...
2 [Heikkinen, Miss. Laina]
3 [Futrelle, Mrs. Jacques Heath (Lily May Peel)]
4 [Allen, Mr. William Henry]
...
886 [Montvila, Rev. Juozas]
887 [Graham, Miss. Margaret Edith]
888 [Johnston, Miss. Catherine Helen "Carrie"]
889 [Behr, Mr. Karl Howell]
890 [Dooley, Mr. Patrick]
Name: Name, Length: 891, dtype: object
使用 Series.str.split() 方法,每个值都作为 2 个元素的列表返回。第一个元素是逗号之前的部分,第二个元素是逗号之后的部分。
titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)
titanic["Surname"]
0 Braund
1 Cumings
2 Heikkinen
3 Futrelle
4 Allen
...
886 Montvila
887 Graham
888 Johnston
889 Behr
890 Dooley
Name: Surname, Length: 891, dtype: object
由于我们只对表示姓氏的第一部分(元素 0)感兴趣,我们可以再次使用 str 访问器并应用 Series.str.get() 来提取相关部分。str实际上,这些字符串函数可以连接起来,一次组合多个函数!
提取有关泰坦尼克号上伯爵夫人的乘客数据。
titanic["Name"].str.contains("Countess")
0 False
1 False
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Name: Name, Length: 891, dtype: bool
titanic[titanic["Name"].str.contains("Countess")]
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Surname | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
759 | 760 | 1 | 1 | Rothes, the Countess. of (Lucy Noel Martha Dye... | female | 33.0 | 0 | 0 | 110152 | 86.5 | B77 | S | Rothes |
字符串方法 Series.str.contains()() 检查列中的每个值Name,并为每个值返回 True(Countess 是名称的一部分)或 False(CountessCountessCountess 不是名称的一部分)。此输出可用于使用数据子集教程中介绍的条件(布尔)索引对数据进行子选择。由于泰坦尼克号上只有一个伯爵夫人,结果我们得到了一排。
【注意】支持对字符串进行更强大的提取,因为 Series.str.contains() 和 Series.str.contains()Series.str.extract() 方法接受正则表达式
泰坦尼克号的哪位乘客名字最长?
titanic["Name"].str.len()
0 23
1 51
2 22
3 44
4 24
..
886 21
887 28
888 40
889 21
890 19
Name: Name, Length: 891, dtype: int64
要获得最长的名称,我们首先必须获取Name列中每个名称的长度。通过使用 pandas 字符串方法,Series.str.len() 函数分别应用于每个名称(元素)。
titanic["Name"].str.len().idxmax()
307
接下来,我们需要在名称长度最大的表中获取相应的位置,最好是索引标签。idxmax() 方法正是这样做的。它不是字符串方法,适用于整数,因此不使用 str。
titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]
'Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)'
根据行 (307) 和列的索引名 (Name),我们可以使用 loc 运算符进行选择
在“性别”列中,将“男性”的值替换为“M”,将“女性”的值替换为“F”。
titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})
titanic["Sex_short"]
0 M
1 F
2 F
3 F
4 M
..
886 M
887 F
888 F
889 M
890 M
Name: Sex_short, Length: 891, dtype: object
虽然 replace() 不是一个字符串方法,但它提供了一种使用映射或词汇来转换某些值的便捷方法。它需要一个dictionary来定义映射 {from : to}.
还有一个 replace() 方法可用于替换一组特定的字符。但是,当具有多个值的映射时,这将变为:
titanic[“Sex_short”] = titanic[“Sex”].str.replace(“female”, “F”)
titanic[“Sex_short”] = titanic[“Sex_short”].str.replace(“male”, “M”)
这会变得繁琐,并且容易导致错误。
【小结】
字符串方法可以使用 str 访问器。
字符串方法按元素工作,可用于条件索引。
replace方法是根据给定字典转换值的便捷方法。