文本数据是我们经常分析的数据,但是,文本通常不会以良好和清洁的格式出现,并且需要进行许多预处理。 Pandas提供许多函数来修改和处理字符串数据。 在进行字符串操作之前,最好先了解一下Pandas如何处理字符串数据类型。
Object vs String
在Pandas 1.0版本之前,仅使用“Object”数据类型来存储字符串,但是有时候会导致一些问题,因为也可以使用“Object”数据类型存储非字符串数据。 Pandas1.0以后版本引入了一个特定于字符串数据的新数据类型,它是StringDType。 目前,我们仍然可以使用Object或StringDType来存储字符串,但在将来,我们可能需要只需要使用StringDType。
这里要注意的一个重要事项是Object数据类型仍然是字符串的默认数据类型。 要使用StringDType,我们需要明确说明。
我们可以将“string”或pd.stringdtype()参数传递给dtype参数以选择字符串数据类型。
代码示例使用jupyter lab。
输入:
a = pd.Series(['a', 'b', 'c'])
a
输出:
0 a
1 b
2 c
dtype: object
输入:
a = pd.Series(['a', 'b', 'c'], dtype = 'string')
a
输出:
0 a
1 b
2 c
dtype: string
输入:
a = pd.Series(['a', 'b', 'c'], dtype = pd.StringDtype())
a
输出:
0 a
1 b
2 c
dtype: string
还有一种方法将数据转换成string类型,即使用astype函数。
a = pd.Series(['a', 'b', 'c'])
a
0 a
1 b
2 c
dtype: object
a.astype('string')
0 a
1 b
2 c
dtype: string
字符串处理方法
大小写转换
在处理英文字符串时,首先想到的是如何处理小写和大写字母,对于计算机来说A和a的区别就像A和k或其他任何字符的区别一样。
upper() 和lower()方法可以用来解决这个问题。 输入
a = pd.Series(['tom', 'jack', 'john'])
a.str.upper()
输出
0 TOM
1 JACK
2 JOHN
dtype: object
输入
a = pd.Series(['tom', 'jack', 'john'])
a.str.lower()
输出
0 tom
1 jack
2 john
dtype: object
Strip方法
如果字符串的开头或结尾有空格,我们应该修剪字符串以消除空格。strip()方法可用于执行此任务: 输入
a = pd.Series(['tom ', 'jack ', ' john'])
a
输出
0 tom
1 jack
2 john
dtype: object
输入
a.str.strip(' ')
输出
0 tom
1 jack
2 john
dtype: object
还有lstrip和rstrip方法分别删除前后的空格。
Split方法
有时字符串携带多条信息,为了利用不同类型的信息,我们需要拆分字符串。使用的方法就是split()方法。 只需要将用来分隔的符号传递给split方法即可得到结果,默认参数是空格字符。 输入
a = pd.Series(['tom,jack', 'jack,john', 'john,tom'])
输入
a
输出
0 tom,jack
1 jack,john
2 john,tom
dtype: object
输入
a.str.split(',')
输出
0 [tom, jack]
1 [jack, john]
2 [john, tom]
dtype: object
字符串被拆分,新元素被记录在一个列表中。可以使用[]或通过传递索引的get方法访问列表中的元素。 输入
a.str.split(',').str[0]
输出
0 tom
1 jack
2 john
dtype: object
输入
a.str.split(',').str.get(0)
输出
0 tom
1 jack
2 john
dtype: object
我们还可以在分离后与新元素创建DataFrame, expand参数设置为True以创建DataFrame。 输入
a = pd.Series(['tom,jack', 'jack,john,tom', 'john,tom'])
a.str.split(',', expand=True)
输出
0 1 2
0 tom jack None
1 jack john tom
2 john tom None
如果一行没有足够的元素来匹配其他行,则单元格将填充为“None”,我们还可以限制拆分的数量,默认情况下,拆分从左开始,但如果要从右开始,则应使用rsplit。 输入
a = pd.Series(['tom,jack', 'jack,john,tom', 'john,tom'])
a.str.split(',', expand=True, n=1)
输出
0 1
0 tom jack
1 jack john,tom
2 john tom
a = pd.Series(['tom,jack', 'jack,john,tom', 'john,tom'])
a.str.rsplit(',', expand=True, n=1)
输出
0 1
0 tom jack
1 jack,john tom
2 john tom
Cat方法
正如我们在某些情况下需要拆分字符串一样,我们可能需要合并或连接字符串。cat方法用于连接字符串。 我们需要使用 sep 参数在连接的字符串之间传递一个参数。默认情况下,cat 忽略缺失值,但是我们也可以使用 na _ rep 参数指定如何处理它们。 输入
a = pd.Series(['tom', 'jack',np.nan, 'john'])
a
输出
0 tom
1 jack
2 NaN
3 john
dtype: object
输入
a.str.cat(sep=',')
输出
'tom,jack,john'
输入
a.str.cat(sep=',', na_rep='?')
输出
'tom,jack,?,john'
我们还可以进行元素级连接(即向序列中的每个字符串添加一个字符串): 输入
a = pd.Series(['a', 'b', 'a', 'c'])
a.str.cat(['+', '+', '-', "-" ])
输出
0 a+
1 b+
2 a-
3 c-
dtype: object
假设字符串从左到右索引,我们可以使用str[]访问每个索引。 代码示例: 输入
a = pd.Series(['a', 'bc', 'ad', 'c'])
a.str[0]
输出
0 a
1 b
2 a
3 c
dtype: object
输入
a.str[1]
输出
0 NaN
1 c
2 d
3 NaN
dtype: object
如果字符串没有指定的索引,则返回NaN。
Startswith and endswith方法
我们可以分别使用 startswith 和 endswith 根据字符串的开头和结尾来进行布尔索引。 输入
a = pd.Series(['a', 'bc', 'ad', 'c'])
a.str.startswith('a')
输出
0 True
1 False
2 True
3 False
dtype: bool
输入
a = pd.Series(['a', 'bc', 'ad', 'c'])
a.str.endswith('a')
输出
0 True
1 False
2 False
3 False
dtype: bool
Get dummies方法
我们可以从系列中提取虚拟变量。 在编码分类变量时特别有用。 输入
a = pd.Series(['a', 'b', 'c', 'd'])
a.str.get_dummies()
输出
a b c d
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
在机器学习模型中输入分类变量需要这种表示。 如果一个字符串包含多个值,我们可以首先使用sep参数进行拆分和编码: 输入
a = pd.Series(['a,e', 'b,f', 'c', 'd'])
a.str.get_dummies(sep=',')
输出
a b c d e f
0 1 0 0 0 1 0
1 0 1 0 0 0 1
2 0 0 1 0 0 0
3 0 0 0 1 0 0
Len方法
在某些情况下,我们需要Dataframe的column或Series列中的字符串的长度。 要获得每个字符串的长度,我们可以应用len方法。 请记住,len也用于获得Series或DataFrame的长度。 代码示例如下: 输入
a = pd.Series(['abc', 'bcdef', 'cd', 'de'])
a.str.len()
输出
0 3
1 5
2 2
3 2
dtype: int64
Pandas String操作不限于我们在此介绍的内容,但我们所讨论的功能和方法肯定有助于处理字符串数据和加快数据清洁和准备过程。在后续会进一步更新pandas的字符串数据处理的内容。
|