.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']) # False3. 缺失值行为
.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()- 推荐将字符串列转为
stringdtype,以获得一致行为