67_Pandas将切片应用于字符串,以提取任意位置和长度的部分

67_Pandas将切片应用于字符串,以提取任意位置和长度的部分

Python 字符串(内置类型 str)方法应用于 pandas.DataFrame 列(= pandas.Series),请使用 .str(str 访问器)。

例如,可以使用 str.match() 和 str.extract() 使用正则表达式提取字符串的一部分。

在这里,将介绍如何使用切片从任意位置(例如开头或结尾)提取任意长度(字符数)的字符串,并生成新字符串。

以下面的 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