Python中pandas进行字符串操作的完整教学

 更新时间:2026年08月08日 10:21:21   作者:菜冻鱼  
Pandas 通过 .str 访问器提供向量化字符串操作,避免逐行循环,性能远超 Python 原生字符串方法,下面小编就和大家详细介绍一下具体的实现方法吧

Pandas 通过 .str 访问器提供向量化字符串操作,避免逐行循环,性能远超 Python 原生字符串方法。

.str访问器基础

import pandas as pd
import numpy as np

s = pd.Series(['张三', '李四', '王五', '赵六', np.nan])

# 所有 str 方法自动跳过 NaN
print(s.str.len())           # [2, 2, 2, 2, NaN]
print(s.str.lower())         # 全部小写
print(s.str.upper())         # 全部大写

# 也适用于 DataFrame 的列
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'email': ['alice@qq.com', 'bob@gmail.com', 'charlie@163.com']
})
print(df['email'].str.contains('gmail'))
print(df['name'].str.lower())

重要说明: .str 只能用于 objectstring 类型的列。数值列需先 astype(str) 转换。

切片与索引

s = pd.Series(['abcdef', 'ghijkl', 'mnopqr'])

# 位置切片(与 Python 字符串一致)
print(s.str[0])      # 第一个字符
print(s.str[:3])     # 前三个字符
print(s.str[3:5])    # 第 4-5 个字符
print(s.str[-3:])    # 最后三个字符

# get(): 按位置取值(越界不报错)
print(s.str.get(0))     # 第 0 个字符
print(s.str.get(10))    # 越界返回 NaN(而非报错!)

查找与判断

s = pd.Series(['hello world', 'foo bar', 'baz qux corge'])

# contains: 是否包含
print(s.str.contains('oo'))          # 是否含 'oo'
print(s.str.contains('WORLD', case=False))  # 忽略大小写
print(s.str.contains(r'\bw\w+'))     # 正则: 以 w 开头的单词
print(s.str.contains('foo|baz'))     # 正则: 含 foo 或 baz

# startswith / endswith
print(s.str.startswith('he'))
print(s.str.endswith('ld'))

# find / rfind: 返回位置(不存在返回 -1)
print(s.str.find('o'))       # 第一个 'o' 的位置
print(s.str.rfind('o'))      # 最后一个 'o' 的位置

# match: 从开头匹配正则
print(s.str.match(r'h\w+'))   # 以 h 开头的单词

# fullmatch: 整个字符串匹配
print(s.str.fullmatch(r'\w+ \w+'))  # 恰好两个单词

# count: 子串出现次数
print(s.str.count('o'))

# len: 字符串长度
print(s.str.len())

提取与替换

extract()— 正则提取

df = pd.DataFrame({
    'email': ['alice@qq.com', 'bob@gmail.com', 'charlie@163.com']
})

# 提取分组
df[['user', 'domain']] = df['email'].str.extract(
    r'([a-zA-Z0-9._]+)@([a-zA-Z0-9.]+)'
)
print(df)
#              email     user       domain
# 0    alice@qq.com    alice       qq.com
# 1  bob@gmail.com      bob    gmail.com
# 2  charlie@163.com charlie     163.com

extractall()— 提取所有匹配

s = pd.Series(['a1b2', 'c3', 'd4e5f6'])
matches = s.str.extractall(r'([a-z])(\d)')
# 返回 MultiIndex: (原始行号, 匹配号)
# match
# 0 0    a  1
#   1    b  2
# 1 0    c  3
# 2 0    d  4
#   1    e  5
#   2    f  6

# 展开
wide = s.str.extractall(r'([a-z])(\d)').unstack()

replace()— 字符串替换

s = pd.Series(['foo_bar', 'bar_baz', 'baz_qux'])

# 普通替换
print(s.str.replace('_', '-'))

# 正则替换
print(s.str.replace(r'^(...)', r'[\1]', regex=True))
# [foo]_bar  [bar]_baz  [baz]_qux

# n: 只替换前 n 次
print(s.str.replace('_', '-', n=1))

拆分与拼接

split()— 拆分

s = pd.Series(['a,b,c', 'd,e', 'f,g,h,i'])

# 拆分为列表(返回 Series of lists)
print(s.str.split(','))
# 0    [a, b, c]
# 1       [d, e]
# 2    [f, g, h, i]

# expand=True: 拆分为 DataFrame
df_split = s.str.split(',', expand=True)
#    0  1  2  3
# 0  a  b  c  None
# 1  d  e  None None
# 2  f  g  h  i

# n: 限制拆分次数
print(s.str.split(',', n=1, expand=True))
#    0      1
# 0  a    b,c
# 1  d      e
# 2  f  g,h,i

# rsplit: 从右向左拆分
print(s.str.rsplit(',', n=1, expand=True))

cat()— 拼接

s1 = pd.Series(['a', 'b', 'c'])
s2 = pd.Series(['x', 'y', 'z'])

# 拼接两个 Series
print(s1.str.cat(s2, sep='-'))   # ['a-x', 'b-y', 'c-z']

# 拼接一个 Series 的元素为单个字符串
print(s1.str.cat(sep=', '))      # 'a, b, c'

# 拼接 DataFrame 的多列
df = pd.DataFrame({'first': ['A', 'B'], 'last': ['Smith', 'Jones']})
df['full'] = df['first'].str.cat(df['last'], sep=' ')

join()— 用分隔符连接列表元素

s = pd.Series([['a', 'b', 'c'], ['d', 'e'], ['f']])
print(s.str.join('-'))  # ['a-b-c', 'd-e', 'f']

清理与修整

s = pd.Series(['  hello  ', '  world', 'foo  '])

# 去空格
print(s.str.strip())      # 去两端空格
print(s.str.lstrip())     # 去左侧空格
print(s.str.rstrip())     # 去右侧空格

# 指定要去除的字符
print(s.str.strip('[]'))  # 去两端的中括号

# pad / center / ljust / rjust
s = pd.Series(['a', 'bb', 'ccc'])
print(s.str.pad(5, side='both', fillchar='-'))   # 居中填充
print(s.str.pad(5, side='left', fillchar='0'))    # 左填充
print(s.str.pad(5, side='right', fillchar='.'))   # 右填充
# 等价: s.str.center(5, '-'), s.str.ljust(5, '0'), s.str.rjust(5, '.')

# zfill: 左侧补零
s = pd.Series(['12', '345', '6'])
print(s.str.zfill(4))    # ['0012', '0345', '0006']

# repeat: 重复字符串
print(s.str.repeat(2))   # ['1212', '345345', '66']

# wrap: 文本换行
long_text = pd.Series(['This is a very long sentence that needs wrapping'])
print(long_text.str.wrap(20))  # 每 20 字符换行

大小写转换

s = pd.Series(['hello world', 'foo BAR', 'Baz QUX'])

print(s.str.lower())         # 全小写
print(s.str.upper())         # 全大写
print(s.str.title())         # 每个单词首字母大写
print(s.str.capitalize())    # 句首大写
print(s.str.swapcase())      # 大小写互换
print(s.str.casefold())      # 更激进的小写化(用于不区分大小写比较)

数值提取与判断

# 判断类
s = pd.Series(['123', 'abc', '456def', '   '])
print(s.str.isnumeric())     # 是否全数字
print(s.str.isalpha())       # 是否全字母
print(s.str.isalnum())       # 是否全字母数字
print(s.str.isdigit())       # 是否全数字字符
print(s.str.isdecimal())     # 是否全十进制数字
print(s.str.isspace())       # 是否全空白
print(s.str.islower())       # 是否全小写
print(s.str.isupper())       # 是否全大写
print(s.str.istitle())       # 是否标题格式

# 正则 + 数值转换
s = pd.Series(['价格: 100元', '价格: 250元', '价格: 38元'])
prices = s.str.extract(r'(\d+)').astype(float)

高级技巧

get_dummies()— 字符串独热编码

s = pd.Series(['a|b', 'a', 'b|c|d'])
dummies = s.str.get_dummies(sep='|')
#    a  b  c  d
# 0  1  1  0  0
# 1  1  0  0  0
# 2  0  1  1  1

normalize()— Unicode 规范化

s = pd.Series(['café', 'café'])  # 视觉相同但编码不同
print(s.str.normalize('NFC'))   # 组合形式
print(s.str.normalize('NFD'))   # 分解形式

removeprefix()/removesuffix()

s = pd.Series(['prefix_foo', 'prefix_bar'])
print(s.str.removeprefix('prefix_'))  # ['_foo', '_bar']
print(s.str.removesuffix('.txt'))

链式 str 操作

emails = pd.Series(['  ALICE@QQ.COM  ', 'BOB@GMAIL.COM'])
# 清洗 -> 提取 -> 转换
result = (emails
    .str.strip()
    .str.lower()
    .str.extract(r'(.+)@(.+)'))

.str方法速查表

类别方法说明
判断contains, startswith, endswith, match匹配检查
判断isnumeric, isalpha, isalnum, isdigit类型检查
查找find, rfind, count位置与计数
提取extract, extractall正则提取
替换replace字符串替换
拆分split, rsplit, partition拆分
拼接cat, join合并
清理strip, lstrip, rstrip去空格
填充pad, center, ljust, rjust, zfill对齐填充
大小写lower, upper, title, capitalize大小写
编码get_dummies, normalize转换
切片[], get, slice索引切片

到此这篇关于Python中pandas进行字符串操作的完整教学的文章就介绍到这了,更多相关Python pandas字符串操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • tensorflow构建BP神经网络的方法

    tensorflow构建BP神经网络的方法

    这篇文章主要为大家详细介绍了tensorflow构建BP神经网络的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • python中selenium操作下拉滚动条的几种方法汇总

    python中selenium操作下拉滚动条的几种方法汇总

    这篇文章主要介绍了python中selenium操作下拉滚动条的几种方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python使用random模块生成随机数操作实例详解

    Python使用random模块生成随机数操作实例详解

    这篇文章主要介绍了Python使用random模块生成随机数操作,结合具体实例形式详细分析了random模块生成随机数的各种常用技巧与相关操作注意事项,需要的朋友可以参考下
    2019-09-09
  • Python字符串中转义字符的完全指南

    Python字符串中转义字符的完全指南

    转义字符是编程语言中一种特殊的字符序列,通常以反斜杠(\)开头,用于在字符串中表示那些无法直接输入或者具有特殊含义的字符,下面小编来和大家详细介绍一下它吧
    2025-05-05
  • Python中Wxpython实现剪切、复制、粘贴和文件打开示例

    Python中Wxpython实现剪切、复制、粘贴和文件打开示例

    我们在Python开发中中,可以使用WxPython库来创建GUI应用程序,并实现剪切、复制、粘贴和文件打开功能,本文就来介绍一下,感兴趣的可以了解一下
    2024-03-03
  • PyTorch的torch.cat用法

    PyTorch的torch.cat用法

    这篇文章主要介绍了PyTorch的torch.cat用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 检测tensorflow是否使用gpu进行计算的方式

    检测tensorflow是否使用gpu进行计算的方式

    今天小编就为大家分享一篇检测tensorflow是否使用gpu进行计算的方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python os 模块与路径从基础到实战应用

    Python os 模块与路径从基础到实战应用

    本文详解Python中os模块与路径处理,涵盖目录创建、遍历、删除及文件操作,提供日志管理、数据备份等实战案例,强调跨平台兼容与异常处理最佳实践,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-08-08
  • 使用Selenium控制当前已经打开的chrome浏览器窗口

    使用Selenium控制当前已经打开的chrome浏览器窗口

    有时通过selenium打开网站时,发现有些网站需要扫码登录,就很头疼,导致爬虫进展不下去,下面这篇文章主要给大家介绍了关于使用Selenium控制当前已经打开的chrome浏览器窗口的相关资料,需要的朋友可以参考下
    2022-07-07
  • python+Word2Vec实现中文聊天机器人的示例代码

    python+Word2Vec实现中文聊天机器人的示例代码

    本文主要介绍了python+Word2Vec实现中文聊天机器人,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论