本文目录导读:

我来详细讲解Pandas中字符串操作的常用方法和案例。
基础准备
import pandas as pd
import numpy as np
# 创建示例数据
data = pd.DataFrame({
'name': ['Alice Wang', 'Bob Li', 'Charlie Zhang', 'David Chen'],
'email': ['alice@example.com', 'bob@gmail.com', 'charlie@163.com', 'david@qq.com'],
'phone': ['138-1234-5678', '139-2345-6789', '137-3456-7890', '136-4567-8901'],
'info': [' Hello World ', 'Python&DATA', 'Data_Science', 'Machine Learning ']
})
print(data)
字符串方法访问器 .str
# 使用.str访问器调用字符串方法 # 转换为大写 print(data['name'].str.upper()) # 转换为小写 print(data['email'].str.lower()) # 计算字符串长度 print(data['name'].str.len())
字符串拆分和连接
# 拆分字符串
# 按空格拆分姓名
name_split = data['name'].str.split(' ')
print("拆分结果:")
print(name_split)
# 拆分并展开为多列
name_parts = data['name'].str.split(' ', expand=True)
name_parts.columns = ['first_name', 'last_name']
print("\n展开后的结果:")
print(name_parts)
# 拆分电话
data[['area_code', 'phone_part1', 'phone_part2']] = data['phone'].str.split('-', expand=True)
print("\n电话拆分结果:")
print(data)
# 字符串连接
data['full_name'] = data['name'].str.replace(' ', '_')
print("\n连接后的名字:")
print(data['full_name'])
字符串查找和替换
# 包含检查
print("包含'gmail'的邮箱:")
print(data['email'].str.contains('gmail'))
# 统计包含特定字符串的个数
print("\ngmail邮箱数量:", data['email'].str.contains('gmail').sum())
# 字符串替换
# 替换所有'@'为'[at]'
data['email_encoded'] = data['email'].str.replace('@', '[at]')
print("\n编码后的邮箱:")
print(data['email_encoded'])
# 正则表达式替换
# 替换所有数字为'#'
data['phone_masked'] = data['phone'].str.replace(r'\d', '#')
print("\n脱敏后的电话:")
print(data['phone_masked'])
去除空白字符
# 去除字符串两端的空白
data['info_clean'] = data['info'].str.strip()
print("去除空白后:")
print(data['info_clean'])
# 只去除左侧空白
print("\n去除左侧空白:")
print(data['info'].str.lstrip())
# 只去除右侧空白
print("\n去除右侧空白:")
print(data['info'].str.rstrip())
截取子字符串
# 获取邮箱用户名
data['username'] = data['email'].str.split('@').str[0]
print("邮箱用户名:")
print(data['username'])
# 提取邮箱域名
data['domain'] = data['email'].str.split('@').str[1]
print("\n邮箱域名:")
print(data['domain'])
# 使用切片获取姓氏(假设最后一个字符是姓)
data['surname'] = data['name'].str.split(' ').str[-1]
# 使用.str.slice()切片
data['initials'] = data['name'].str.slice(0, 1) # 获取第一个字母
print("\n姓名首字母:")
print(data['initials'])
正则表达式操作
# 使用正则表达式提取信息
# 提取邮箱类型
data['email_type'] = data['email'].str.extract(r'@(\w+)\.')
print("邮箱类型:")
print(data['email_type'])
# 提取所有数字
data['phone_numbers'] = data['phone'].str.findall(r'\d')
print("\n电话中的数字:")
print(data['phone_numbers'])
# 检查字符串是否匹配模式
print("\n是否包含大写字母:")
print(data['name'].str.match(r'[A-Z]'))
# 正则表达式替换
data['info_formatted'] = data['info'].str.replace(r'[^a-zA-Z\s]', ' ')
print("\n只保留字母和空格:")
print(data['info_formatted'])
实际案例分析
# 创建一个更真实的数据集
employee_data = pd.DataFrame({
'employee_id': ['EMP001', 'EMP002', 'EMP003', 'EMP004'],
'name': ['Alice Wang', 'Bob Li', 'Charlie Zhang', 'David Chen'],
'email': ['alice.wang@company.com', 'bob.li@company.com',
'charlie.zhang@company.com', 'david.chen@company.com'],
'hire_date': ['2023-01-15', '2023-03-20', '2023-06-10', '2023-09-01'],
'department': ['Sales-USA', 'Engineering-China', 'Marketing-USA', 'Sales-China']
})
print("原始数据:")
print(employee_data)
# 任务1: 创建员工缩写
employee_data['short_name'] = employee_data['name'].str.split().apply(
lambda x: x[0][0] + '.' + x[1][0] + '.')
print("\n员工缩写:")
print(employee_data[['name', 'short_name']])
# 任务2: 提取部门和国家
employee_data[['department_name', 'country']] = employee_data['department'].str.split('-', expand=True)
print("\n部门和国家:")
print(employee_data[['department', 'department_name', 'country']])
# 任务3: 创建用户名(邮箱前缀)
employee_data['username'] = employee_data['email'].str.split('@').str[0]
print("\n用户名:")
print(employee_data[['email', 'username']])
# 任务4: 格式化日期
employee_data['hire_year'] = employee_data['hire_date'].str[:4]
employee_data['hire_month'] = employee_data['hire_date'].str[5:7]
print("\n入职年份和月份:")
print(employee_data[['hire_date', 'hire_year', 'hire_month']])
# 任务5: 创建员工代码
employee_data['employee_code'] = (
employee_data['employee_id'].str[-3:] + '-' +
employee_data['department_name'].str[:3].str.upper()
)
print("\n员工代码:")
print(employee_data[['employee_id', 'department_name', 'employee_code']])
字符串清理实战
# 处理脏数据
dirty_data = pd.DataFrame({
'product_code': [' PROD-001 ', 'prod-002', 'PROD-003 ', ' prod-004'],
'price': ['$100.00', '$200.50', '$150.75', '$300.00'],
'description': [' Laptop Computer ', 'Smart Phone 2024', ' Tablet Device ', 'Desktop PC']
})
print("脏数据:")
print(dirty_data)
# 清理数据
dirty_data_clean = dirty_data.copy()
# 1. 去除产品代码两端的空白并转换大写
dirty_data_clean['product_code'] = dirty_data_clean['product_code'].str.strip().str.upper()
# 2. 去除价格中的$符号并转换为数字
dirty_data_clean['price_clean'] = dirty_data_clean['price'].str.replace('$', '').astype(float)
# 3. 清理描述信息
dirty_data_clean['description'] = dirty_data_clean['description'].str.strip().str.title()
print("\n清理后数据:")
print(dirty_data_clean)
常见字符串操作总结
# 创建示例数据
text_data = pd.Series([
' Hello World ',
'Python Programming',
'data-science',
'Machine_Learning',
None
])
print("原始数据:")
print(text_data)
# 常用操作汇总
print("\n=== 字符串操作汇总 ===")
print("转换为大写:", text_data.str.upper().tolist())
print("转换为小写:", text_data.str.lower().tolist())
print("长度:", text_data.str.len().tolist())
print("去除空白:", text_data.str.strip().tolist())
print("包含'Python':", text_data.str.contains('Python', na=False).tolist())
print("替换'-'为' ':",
text_data.str.replace('-', ' ', regex=False).tolist())
print("替换'_'为' ':",
text_data.str.replace('_', ' ', regex=False).tolist())
print("填充空值:", text_data.fillna('').str.strip().tolist())
Pandas的字符串操作非常强大,结合正则表达式可以实现复杂的数据清洗和提取任务,记住使用 .str 访问器来调用字符串方法,并善用 fillna() 处理缺失值。