.str 是 pandas 为字符串列提供的访问器,它把 Python 字符串方法批量应用到 Series 的每个元素上,返回同长度的新 Series 或 DataFrame。


1. 什么是 .str 访问器

pandas 中的 Series.str 允许对 Series 中的每个字符串元素调用(几乎)所有 Python str 方法,以及 pandas 扩展的正则与拆合方法。

import pandas as pd
 
s = pd.Series(['Python', 'pandas', 'numpy'])
s.str.lower()
# 0    python
# 1    pandas
# 2    numpy

本质

.str 并非 Series 的属性数据,而是一个访问器对象,它拦截方法调用并向量化执行。


2. 适用对象

.str 只能用于字符串类型的 Series:

dtype是否支持说明
object✅最常见的字符串存储类型
string(StringDtype)✅pandas 推荐的字符串类型
category(字符串类别)✅需先确认底层为字符串
int / float / bool❌需先用 astype 转换
s = pd.Series([1, 2, 3])
# s.str  # AttributeError: Can only use .str accessor with string values
 
# 正确转换
s.astype(str).str.len()
# 0    1
# 1    1
# 2    1

常见列类型检查

df = pd.DataFrame({'A': ['a', 'b'], 'B': [1, 2]})
 
df['A'].dtype    # object
df['B'].dtype    # int64
 
# 判断是否为字符串类型
pd.api.types.is_string_dtype(df['A'])   # True
pd.api.types.is_string_dtype(df['B'])   # False

3. 缺失值行为

.str 方法自动跳过缺失值:

s = pd.Series(['apple', None, 'banana'])
 
s.str.upper()
# 0    APPLE
# 1     None
# 2    BANANA

注意

  • 返回结果的缺失值默认是 NaN(即使原列是 string 类型也可能是 pd.NA)
  • 若需特定缺失行为,部分方法提供 na 参数(如 contains(..., na=False))
  • 缺失值在 str.split(expand=True) 中会产生整行 NaN

4. 非字符串元素的行为

object 列中若混有非字符串元素,.str 会尝试自动转换:

s = pd.Series(['a', 1, 2.5, True])
 
s.str.upper()
# 0       A
# 1      '1'
# 2    '2.5'
# 3    'TRUE'

风险提示

混合类型列使用 .str 可能产生不可预测的结果。建议先统一转为 string 或 object(str) 类型。

s = pd.Series(['a', 1, 2.5]).astype('string')

5. 与 Python str 方法的差异

差异点Python str.str 访问器
作用对象单个字符串整个 Series
返回类型字符串/布尔/元组等Series / DataFrame
缺失值无概念自动跳过或传播
正则支持re 模块内置正则参数
性能循环调用向量化执行

6. 常用属性

.str 还提供少量属性:

属性说明
s.str.len()字符串长度(是方法,不是属性)
s.str 本身访问器对象
s.str 没有常见属性如需要,直接调用方法

pandas 2.x 中的变化

  • str.replace 的 regex 参数在 pandas 2.x 中变为显式指定:regex=True 表示正则,regex=False 表示字面替换
  • 新增 str.removeprefix() 与 str.removesuffix()
  • 推荐将字符串列转为 string dtype,以获得一致行为