本章覆盖字符串处理中最基础、最常用的方法:大小写转换、空白处理、填充对齐、长度与计数。


1. 大小写转换

方法说明示例
str.lower()全部小写'ABC' → 'abc'
str.upper()全部大写'abc' → 'ABC'
str.title()每个单词首字母大写'hello world' → 'Hello World'
str.capitalize()仅首字母大写'hello WORLD' → 'Hello world'
str.swapcase()大小写互换'aBc' → 'AbC'
str.casefold()激进式小写(适合国际化)'Straße' → 'strasse'
s = pd.Series(['hello WORLD', 'pYTHON 3', None])
 
s.str.title()
# 0    Hello World
# 1    Python 3
# 2           None
 
s.str.casefold()
# 0    hello world
# 1    python 3

应用场景

  • 规范化城市名、用户名等:str.strip().str.title()
  • 邮箱、URL 比较前统一小写:str.lower()

2. 空白处理

方法说明
str.strip()去除两端空白(空格、\t、\n、\r 等)
str.lstrip()去除左侧空白
str.rstrip()去除右侧空白
s = pd.Series(['  python  ', '\tdata\n', ' pandas ', '  '])
 
s.str.strip()
# 0    python
# 1      data
# 2    pandas
# 3
 
s.str.strip().str.len()
# 0    6
# 1    4
# 2    6
# 3    0

去除指定字符

s = pd.Series(['...hello...', '###World###'])
s.str.strip('.')
# 0    hello
# 1    ###World###(没有开头点,未去除)
 
s.str.strip('#')
# 0    ...hello...
# 1        World
 
# 同时去除多种字符
s = pd.Series(['-_-data-_-'])
s.str.strip('-_')
# 0    data

注意

strip() 的参数是字符集合,会去除出现在集合中的所有字符,而非去除整个字符串。


3. 填充与对齐

str.pad()

s = pd.Series(['a', 'bb', 'ccc'])
 
s.str.pad(width=5, side='left', fillchar='0')
# 0    0000a
# 1    000bb
# 2    00ccc
 
s.str.pad(width=5, side='right', fillchar='*')
# 0    a****
# 1    bb***
# 2    ccc**

str.center()

s.str.center(width=7, fillchar='-')
# 0    ---a---
# 1    --bb---
# 2    -ccc---

str.zfill()

pd.Series(['1', '23', '456']).str.zfill(5)
# 0    00001
# 1    00023
# 2    00456

str.ljust() / str.rjust()

s.str.ljust(width=5, fillchar='.')
# 0    a....
# 1    bb...
# 2    ccc..
 
s.str.rjust(width=5, fillchar='.')
# 0    ....a
# 1    ...bb
# 2    ..ccc

应用场景

  • 编号补零:df['编号'].astype(str).str.zfill(6)
  • 导出对齐文本:pad(..., fillchar=' ')

4. 长度与计数

str.len()

s = pd.Series(['hello', 'world!', None])
 
s.str.len()
# 0     5.0
# 1     6.0
# 2     NaN

过滤短文本

df = df[df['文本'].str.len() >= 10]

str.count()

s = pd.Series(['abab', 'aabb', 'ab'])
 
# 统计子串出现次数(字面)
s.str.count('ab')
# 0    2
# 1    1
# 2    1
 
# 正则统计
s.str.count('a')  
# 0    2
# 1    2
# 2    1

5. 综合示例

df = pd.DataFrame({
    '用户名': ['  Alice  ', 'BOB', 'Carol_2024', None],
    '邮箱': ['Alice@EXAMPLE.com', 'bob@test.org', 'carol@demo.net', 'none']
})
 
# 规范化用户名
df['用户名_clean'] = df['用户名'].str.strip().str.title()
 
# 邮箱统一小写并判断有效性
df['邮箱_clean'] = df['邮箱'].str.strip().str.lower()
df['邮箱_有效'] = df['邮箱_clean'].str.contains('@')
 
# 统计用户名长度
df['用户名_长度'] = df['用户名_clean'].str.len()
 
# 检查是否存在数字
df['含数字'] = df['用户名_clean'].str.contains(r'\d', regex=True)
 
print(df)

小结

  • 大小写转换:lower / upper / title / capitalize
  • 空白处理:strip / lstrip / rstrip
  • 填充对齐:pad / center / zfill / ljust / rjust
  • 长度与计数:len / count