67_Pandas将切片应用于字符串,以提取任意位置和长度的部分
67_Pandas将切片应用于字符串,以提取任意位置和长度的部分
Python 字符串(内置类型 str)方法应用于 pandas.DataFrame 列(= pandas.Series),请使用 .str(str 访问器)。
例如,可以使用 str.match() 和 str.extract() 使用正则表达式提取字符串的一部分。
在这里,将介绍如何使用切片从任意位置(例如开头或结尾)提取任意长度(字符数)的字符串,并生成新字符串。
-
将切片应用于 pandas 中的字符串列
- 提取第一个字符
- 提取最后一个字符
- 通过指定增量(步长)提取
- 任意位置提取一个字符
- 添加为 pandas.DataFrame 中的列
-
将数字转换为字符串并应用切片
以下面的 pandas.DataFrame 为例。
import pandas as pd
df = pd.DataFrame({'a': ['abcde', 'fghij', 'klmno'],
'b': [123, 456, 789]})
print(df)
# a b
# 0 abcde 123
# 1 fghij 456
# 2 klmno 789
print(df.dtypes)
# a object
# b int64
# dtype: object
将切片应用于 pandas 中的字符串列
可以使用 .str[] 将切片直接应用于字符串列。
提取第一个字符
print(df['a'].str[:2])
# 0 ab
# 1 fg
# 2 kl
# Name: a, dtype: object
提取最后一个字符
使用负值来指定结束。
print(df['a'].str[-2:])
# 0 de
# 1 ij
# 2 no
# Name: a, dtype: object
通过指定增量(步长)提取
尽管可能不经常使用,但也可以指定增量(步骤)。
print(df['a'].str[::2])
# 0 ace
# 1 fhj
# 2 kmo
# Name: a, dtype: object
任意位置提取一个字符
除了切片之外,还可以通过索引(从0开始的位置)提取单个字符。用 -1 指定最后一个字符。
print(df['a'].str[2])
# 0 c
# 1 h
# 2 m
# Name: a, dtype: object
print(df['a'].str[0])
# 0 a
# 1 f
# 2 k
# Name: a, dtype: object
print(df['a'].str[-1])
# 0 e
# 1 j
# 2 o
# Name: a, dtype: object
添加为 pandas.DataFrame 中的列
将提取的列添加为新列。
df['a_head'] = df['a'].str[:2]
print(df)
# a b a_head
# 0 abcde 123 ab
# 1 fghij 456 fg
# 2 klmno 789 kl
将数字转换为字符串并应用切片
如果在字符串类型以外的列上使用带有 str 访问器的字符串方法,则会出现 AttributeError 错误。
# print(df['b'].str[:2])
# AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
使用astype()方法将其转换为字符串str就可以了。
print(df['b'].astype(str).str[:2])
# 0 12
# 1 45
# 2 78
# Name: b, dtype: object
如果想将其视为数字,请再次应用 astype()。
print(df['b'].astype(str).str[:2].astype(int))
# 0 12
# 1 45
# 2 78
# Name: b, dtype: int64
在该示例中,还可以如下计算。除以 10 并转换为整数 int 类型,小数部分被截去。
print((df['b'] / 10).astype(int))
# 0 12
# 1 45
# 2 78
# Name: b, dtype: int64