📜  Python | Pandas处理文本text数据

📅  最后修改于: 2020-04-20 13:44:43             🧑  作者: Mango

系列和索引配备了一组字符串处理方法,这些方法使操作数组中的每个元素变得容易。也许最重要的是,这些方法会自动排除丢失/ NA值。这些可以通过str属性访问,并且通常具有与等效的(标量)内置字符串方法匹配的名称。

大写和小写数据

为了小写数据,我们使用str.lower()这个函数将所有大写字符转换为小写。如果不存在大写字符,则返回原始字符串。为了大写数据,我们使用str.upper()这个函数将所有小写字符转换为大写。如果不存在小写字符,则返回原始字符串。
代码1: 

# 导入pandas
import pandas as pd
# 定义包含员工数据的字典
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Delhi', 'Kanpur', 'Allahabad', 'Kannauj'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# 将字典转换为DataFrame
df = pd.DataFrame(data)
# 转换和覆盖列中的值
df["Name"]= df["Name"].str.lower()
print(df)

输出:


如数据帧的输出图像所示,名称列中的所有值均已转换为小写。

在此示例中,我们使用nba.csv文件。
代码2 

# 导入pandas
import pandas as pd
# 从csv文件制作数据帧
data = pd.read_csv("nba.csv")
# 转换和覆盖列中的值
data["Team"]= data["Team"].str.upper()
# display
data

输出:


如数据帧的输出图像所示,“team”列中的所有值均已转换为大写。

拆分和替换数据

为了分割数据,我们使用str.split()这个函数,通过指定的分隔符将给定的字符串分隔开之后返回一个字符串列表,但是它只能应用于单个字符串。str.split()方法可以应用于整个系列。每次都必须在.str前面加上前缀,才能调用此方法以将其与Python的默认函数区分开,否则,它将引发错误。为了替换数据,我们使用str.replace()这个函数仅像Python 方法一样工作,但是它也可以在Series上工作。在调用Pandas系列之前,必须为.str加上前缀,以便将其与Python的默认replace方法区分开。

代码#1 .replace().replace()

# 导入pandas
import pandas as pd
# 定义包含员工数据的字典
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Nagpur', 'Kanpur', 'Allahabad', 'Knnuaj'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# 将字典转换为DataFrame
df = pd.DataFrame(data)
# 删除空值列以避免错误
df.dropna(inplace = True)
# 具有拆分值的新数据框
df["Address"]= df["Address"].str.split("a", n = 1, expand = True)
# df display
print(df)

输出:

如输出图像中所示,由于n参数设置为1(字符串中最大间隔为1),所以地址列在第一次出现“ a”而不是在以后出现时被分隔。

代码2:

# 导入pandas
import pandas as pd
# 从网址读取csv文件
data = pd.read_csv("nba.csv")
# 覆盖年龄替换值的列
data["Age"]= data["Age"].replace(25.0, "Twenty five")
# 为年龄列创建过滤器
# age = "Twenty five"
filter = data["Age"]=="Twenty five"
# 仅打印过滤的列
data.where(filter).dropna()

输出:


如输出图像所示,“age”列中所有年龄为25.0的值已被替换为“二十五”。

数据串联

为了连接一个Series或Index,我们使用str.cat()这个函数用于将字符串连接到传递的调用者字符串系列。可以传递来自不同系列的不同值,但是两个系列的长度必须相同。必须为.str加上前缀,以使其与Python的默认方法区分开。
代码1:

# 导入pandas
import pandas as pd
# 定义包含员工数据的字典
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Nagpur', 'Kanpur', 'Allahabad', 'Kannuaj'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# 将字典转换为DataFrame
df = pd.DataFrame(data)
# 复制地址栏
new = df["Address"].copy()
# 将地址与名称列连接在一起覆盖名称列
df["Name"]= df["Name"].str.cat(new, sep =", ")
# 打印
print(df)

输出:


如输出图像中所示,“address”列中与“name”列中的索引相同的每个字符串都已用“分隔符“, ““连接起来。

代码2:

# 导入pandas
import pandas as pd
# 从链接导入csv
data = pd.read_csv("nba.csv")
# 复制
new = data["Team"].copy()
# 连接名称列的团队覆盖名称列
data["Name"]= data["Name"].str.cat(new, sep =", ")
# 打印
data

输出:


如输出图像所示,“团队”列中与“名称”列中的索引相同的每个字符串都已用分隔符“,”连接起来。

删除数据空白

为了删除空格,我们使用str.strip(),str.rstrip()和str.lstrip()这些函数来处理任何文本数据中的空格(包括换行)。从名称中可以看出,str.lstrip()用于删除字符串左侧的空格,str.rstrip()用于删除字符串右侧的空格,而str.strip()则同时删除字符串的空格双方。由于这些是与Python的默认函数同名的pandas函数,因此必须在前缀.str之前告知编译器正在调用Pandas函数。
代码1:

# 导入pandas
import pandas as pd
# 定义包含员工数据的字典
data = {'Name':['Jai', 'Princi', 'Gaurav', 'Anuj'],
        'Age':[27, 24, 22, 32],
        'Address':['Nagpur junction', 'Kanpur junction',
                   'Nagpur junction', 'Kannuaj junction'],
        'Qualification':['Msc', 'MA', 'MCA', 'Phd']}
# 将字典转换为DataFrame
df = pd.DataFrame(data)
# 替换地址名称并在开头和结尾添加空格
new = df["Address"].replace("Nagpur junction", "  Nagpur junction  ").copy()
# 用自定义字符串检查
print(new.str.strip()==" Nagpur junction")
print(new.str.strip()=="Nagpur junction ")
print(new.str.strip()==" Nagpur junction ")

输出:


如输出图像所示,对于所有3个条件,比较均返回False,这意味着空格已成功从两侧移除,并且字符串不再具有空格。

代码2:

# 导入pandas
import pandas as pd
# 制作数据框
data = pd.read_csv("nba.csv")
# 替换团队名称并在开始和结束处添加空格
new = data["Team"].replace("Boston Celtics", "  Boston Celtics  ").copy()
# 使用自定义删除的空格字符串检查
new.str.lstrip()=="Boston Celtics  "

输出:

如输出图像所示,删除左侧空格后,比较为真

提取数据

为了提取数据,我们使用str.extract()。此函数接受带有至少一个捕获组的正则表达式。提取一组以上的正则表达式将返回一个DataFrame,每组包含一列。不匹配的元素将返回用NaN填充的行。
代码1:

# 导入pandas
import pandas as pd
# 创建一个系列
s = pd.Series(['a1', 'b2', 'c3'])
# 提取数据
n= s.str.extract(r'([ab])(\d)')
print(n)

输出:


如输出图像所示,两组将返回一个具有两列的DataFrame。不匹配项为NaN。

代码2:

# 导入pandas
import pandas as pd
# 创建一个系列
s = pd.Series(['a1', 'b2', 'c3'])
# 提取数据
n = s.str.extract(r'(?P<芒果>[ab])(?P\d)')
print(n)

输出:


如输出图像所示,该命名的组将成为结果中的列名。

Pandas str方法:

函数 描述
str.lower() 将字符串的字符转换为小写的方法
str.upper() 将字符串的字符转换为大写的方法
str.find() 方法用于搜索序列中存在的每个字符串中的子字符串
str.rfind() 方法用于从右侧搜索系列中存在的每个字符串中的子字符串
str.findall() 方法还用于在系列中的每个字符串中查找子字符串或分隔符
str.isalpha() 方法用于检查序列中每个字符串中的所有字符是否都是字母(az / AZ)
str.isdecimal() 方法用于检查字符串中的所有字符是否均为十进制
str.title() 字符串中每个单词的首字母大写的方法
str.len() 方法返回字符串中字符数的计数
str.replace() 方法用用户提供的另一个值替换字符串中的子字符串
str.contains() 方法测试模式或正则表达式是否包含在系列或索引的字符串中
str.extract() 从正则表达式模式的第一个匹配项中提取组。
str.startswith() 方法测试每个字符串元素的开头是否与模式匹配
str.endswith() 方法测试每个字符串元素的末尾是否与模式匹配
str.isdigit() 用于检查序列中每个字符串中的所有字符是否都是数字的方法
str.lstrip() 方法从字符串的左侧(开头)删除空格
str.rstrip() 方法从字符串的右侧(结尾)删除空格
str.strip() 从字符串中删除开头和结尾空格的方法
str.split() 方法根据用户指定的值的出现来拆分字符串值
str.join() 方法用于通过传递的定界符连接列表中存在的列表中的所有元素
str.cat() 方法用于将字符串连接到传递的调用方字符串系列。
str.repeat() 方法用于在传递的序列本身的相同位置重复字符串值
str.get() 方法用于获取通过位置的元素
str.partition() 与str.split()不同,该方法仅在第一次出现时才拆分字符串
str.rpartition() 方法仅将字符串分割一次,并且反向分割。它的工作方式类似于str.partition()和str.split()
str.pad() 将填充(空格或其他字符)添加到系列中的每个字符串元素的方法
str.swapcase() 交换系列中每个字符串的大小写的方法