本章覆盖字符串处理中最基础、最常用的方法:大小写转换、空白处理、填充对齐、长度与计数。
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 00456str.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 15. 综合示例
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