Python案例如何用Pandas做数据字符串操作

wen python案例 1

本文目录导读:

Python案例如何用Pandas做数据字符串操作

  1. 基础准备
  2. 字符串方法访问器 .str
  3. 字符串拆分和连接
  4. 字符串查找和替换
  5. 去除空白字符
  6. 截取子字符串
  7. 正则表达式操作
  8. 实际案例分析
  9. 字符串清理实战
  10. 常见字符串操作总结

我来详细讲解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() 处理缺失值。

抱歉,评论功能暂时关闭!