7. Pandas 字符串与类别数据处理
Pandas 字符串与类别数据处理
本文将介绍 Pandas 中字符串与类别数据的处理方法,涵盖字符串操作(大小写转换、替换、分割、匹配与查找等)以及类别变量的类型转换与优化。通过示例展示如何在 数据清洗、统计分析与特征工程 中高效处理文本和离散型数据,为后续建模与可视化打下基础。
1. 字符串操作方法
在 Pandas 中,Series
对象的字符串方法可通过 .str
访问,提供了丰富的文本处理功能。
import pandas as pddata = {"姓名": ["张三", "李四", "王五", "赵六"],"城市": ["北京", "上海", "广州", "深圳"],"邮箱": ["ZhangSan@example.com", "Lisi@example.com", "WANGwu@sample.com", "zhaoLIU@test.com"]
}df = pd.DataFrame(data)
print(df)
姓名 城市 邮箱
0 张三 北京 ZhangSan@example.com
1 李四 上海 Lisi@example.com
2 王五 广州 WANGwu@sample.com
3 赵六 深圳 zhaoLIU@test.com
1.1 大小写转换
df1 = pd.DataFrame(df['邮箱'])# 全部大写
df1['邮箱_upper'] = df['邮箱'].str.upper()# 全部小写
df1['邮箱_lower'] = df['邮箱'].str.lower()print(df1)
邮箱 邮箱_upper 邮箱_lower
0 ZhangSan@example.com ZHANGSAN@EXAMPLE.COM zhangsan@example.com
1 Lisi@example.com LISI@EXAMPLE.COM lisi@example.com
2 WANGwu@sample.com WANGWU@SAMPLE.COM wangwu@sample.com
3 zhaoLIU@test.com ZHAOLIU@TEST.COM zhaoliu@test.com
1.2 字符串替换
# 将邮箱中的 example.com 替换为 demo.com
df['邮箱'] = df['邮箱'].str.replace('example.com', 'demo.com')
print(df)
姓名 城市 邮箱
0 张三 北京 ZhangSan@demo.com
1 李四 上海 Lisi@demo.com
2 王五 广州 WANGwu@sample.com
3 赵六 深圳 zhaoLIU@test.com
1.3 字符串分割
# 提取邮箱用户名(@ 前的部分)
df['邮箱用户名'] = df['邮箱'].str.split('@').str[0]
print(df)
姓名 城市 邮箱 邮箱用户名
0 张三 北京 ZhangSan@demo.com ZhangSan
1 李四 上海 Lisi@demo.com Lisi
2 王五 广州 WANGwu@sample.com WANGwu
3 赵六 深圳 zhaoLIU@test.com zhaoLIU
1.4 字符串匹配与查找
# 检查邮箱中是否包含 'demo'
df['包含_demo'] = df['邮箱'].str.contains('demo')
print(df)
姓名 城市 邮箱 邮箱用户名 包含_demo
0 张三 北京 ZhangSan@demo.com ZhangSan True
1 李四 上海 Lisi@demo.com Lisi True
2 王五 广州 WANGwu@sample.com WANGwu False
3 赵六 深圳 zhaoLIU@test.com zhaoLIU False
更多常用字符串方法:
- 去除空格:
str.strip()
- 提取子串:
str.slice(start, end)
- 正则匹配:
str.extract(pattern)
2. 类别变量处理
类别变量(Categorical Variable)表示有限的离散型特征,例如 性别、地区、等级、学历 等。
在 Pandas 中,可使用 astype('category')
将字符串类型转换为 类别类型,以优化内存并提升计算效率。
# 新增性别列
df['性别'] = ['男', '女', '男', '女']# 转换为类别类型
df['性别'] = df['性别'].astype('category')
print(df.dtypes)
# 新增性别列
df['性别'] = ['男', '女', '男', '女']# 转换为类别类型
df['性别'] = df['性别'].astype('category')
print(df.dtypes)
姓名 object
城市 object
邮箱 object
邮箱用户名 object
包含_demo bool
性别 category
dtype: object
2.1 类别属性与编码
# 查看类别
print(df['性别'].cat.categories)print()# 查看类别编码
print(df['性别'].cat.codes)
Index(['女', '男'], dtype='object')0 1
1 0
2 1
3 0
dtype: int8
2.2 排序类别
# 删除多余的列
df.drop(['邮箱用户名', '包含_demo'], axis=1, inplace=True)# 定义有序类别
df['学历'] = pd.Series(['本科', '硕士', '博士', '本科'])
学历类型 = pd.CategoricalDtype(categories=['本科', '硕士', '博士'], ordered=True)
df['学历'] = df['学历'].astype(学历类型)# 排序
df_sorted = df.sort_values('学历')
print(df_sorted)
姓名 城市 邮箱 性别 学历
0 张三 北京 ZhangSan@demo.com 男 本科
3 赵六 深圳 zhaoLIU@test.com 女 本科
1 李四 上海 Lisi@demo.com 女 硕士
2 王五 广州 WANGwu@sample.com 男 博士
3. 小结
- 字符串处理:通过
.str
可以实现大小写转换、替换、分割、匹配、正则提取等常用操作,便于 文本数据清洗与特征构造。 - 类别变量处理:使用
astype('category')
可减少内存消耗、提升计算效率;结合CategoricalDtype
可以定义 有序类别 并进行排序。 - 应用场景:字符串与类别数据处理在 数据清洗、特征工程和建模 中至关重要,能够为后续的统计分析与机器学习提供更高质量的输入数据。