【Pandas入门教程】如何操作文本数据
创始人
2024-04-30 12:12:49

如何操作文本数据

来源: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()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS

使所有名称字符小写。

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")]
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSurname
75976011Rothes, the Countess. of (Lucy Noel Martha Dye...female33.00011015286.5B77SRothes

字符串方法 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方法是根据给定字典转换值的便捷方法。

相关内容

热门资讯

全球首台20兆瓦海上风电机组在...   光明日报福州1月13日电(记者冯家照)13日,我国在福建海域成功完成全球首台20兆瓦海上风电机组...
校园欺凌告别“内部消化”,公安... 界面新闻记者 | 蔡星卓界面新闻编辑 | 刘海川2026年1月1日,新修订的《中华人民共和国治安管理...
5人违规穿越鳌山最后致3人遇难... 【陕西】5人违规穿越鳌山:最后1名失联者被找到,已无生命体征据央视新闻消息,记者从陕西省宝鸡市太白县...
机构开年“调研忙” 脑机接口等... (来源:经济参考报) 进入2026年以来,伴随着A股市场的震荡上行,机构调研步伐也愈发紧密。Wind...
全国铁路将调图北京与延安间首次... (来源:经济参考报) 记者1月13日从中国国家铁路集团有限公司获悉,1月26日零时起,全国铁路将实行...