pandas 清洗技巧(字符串操作)

122 阅读4分钟

启动Jupyter notebook(因为jupyter是安装在虚拟环境中,所以每次使用该虚拟环境之前激活虚拟环境):

# 激活虚拟环境
source myenv/bin/activate

# 启动虚拟环境
jupyter notebook

正文

pandas提供了丰富的字符串操作功能,可以帮助你在数据清洗和预处理阶段处理文本数据。例如去除空格、大小写转换、正则表达式匹配等。

大小写转换:

  • .str.lower():将所有字符转换为小写。
  • .str.upper():将所有字符转换为大写。
  • .str.capitalize():将字符串首字母转换为大写,其余为小写。
  • .str.title():将每个单词的首字母转换为大写。
import pandas as pd

# 假设这是你的原始数据
data = {'name': ['Amy', 'Tom', 'Jack cat'], 'sex': ['女', '男', '男']}

# 创建DataFrame
df = pd.DataFrame(data)

# 将'name'列中的所有字符串转换为小写
df['name'] = df['name'].str.lower()
print("字符串全部转小写:\n", df)


# 将'name'列中的所有字符串转换为大写
df['name'] = df['name'].str.upper()
print("\n字符串全部转大写:\n", df)


# 将'name'列中字符串首字母转换为大写,其余为小写
df['name'] = df['name'].str.capitalize()
print("\n字符串首字母转换为大写,其余为小写:\n", df)


# 将'name'列中每个单词的首字母转换为大写
df['name'] = df['name'].str.title()
print("\n每个单词首字母转换为大写:\n", df)
字符串全部转小写:
        name sex
0       amy   女
1       tom   男
2  jack cat   男

字符串全部转大写:
        name sex
0       AMY   女
1       TOM   男
2  JACK CAT   男

字符串首字母转换为大写,其余为小写:
        name sex
0       Amy   女
1       Tom   男
2  Jack cat   男

每个单词首字母转换为大写:
        name sex
0       Amy   女
1       Tom   男
2  Jack Cat   男

去除空格:

  • .str.strip():去除字符串两端的空格。
  • .str.lstrip():去除字符串左侧的空格。
  • .str.rstrip():去除字符串右侧的空格。
import pandas as pd

# 假设这是你的原始数据
data = {'name': [' Amy ', ' Tom ', ' Jack cat '], 'sex': ['女', '男', '男']}

# 创建DataFrame
df = pd.DataFrame(data)

# 去除'name'列中字符串两端的空格
df['name'] = df['name'].str.strip()
print("去除字符串两端的空格:\n", df)


# 去除'name'列中字符串左侧的空格
df['name'] = df['name'].str.lstrip()
print("\n去除字符串左侧的空格:\n", df)


# 去除'name'列中字符串右侧的空格
df['name'] = df['name'].str.rstrip()
print("\n去除字符串右侧的空格:\n", df)

字符串替换:

  • .str.replace():替换字符串中的某些字符或模式。

    s = pd.Series(['foo', 'bar', 'baz'])
    
    s.str.replace('foo', 'boo')  # 'boo' 'bar' 'baz'
    s.str.replace('b.*', 'b', regex=True)  # 'f' 'ar' 'az'
    

字符串分割

  • .str.split():按照指定的分隔符将字符串分割成列表。

    python
    s = pd.Series(['a,b,c', 'd,e,f', 'g,h,i'])
    
    s.str.split(',')  # ['a' 'b' 'c'] ['d' 'e' 'f'] ['g' 'h' 'i']
    

字符串填充

  • .str.pad():填充字符串以达到指定的长度。

    s = pd.Series(['a', 'bb', 'ccc'])
    
    s.str.pad(width=5, side='right', fillchar='-')  # 'a----' 'bb---' 'ccc--'
    

字符串截取

  • .str.slice():截取字符串的一部分。
s = pd.Series(['hello', 'world', 'python'])

s.str.slice(1, 3)  # 'el' 'or' 'yt'

在pandas的较新版本中,str.slice() 方法确实已经被弃用,因为它可以通过直接使用 Python 的切片语法来更简洁、更直观地实现相同的功能。

s = pd.Series(['hello', 'world', 'python'])

# 使用 Python 切片语法来替换 .str.slice()
# 切片从索引 1 开始(包含),到索引 3 结束(不包含)
s.str[1:3]  # 'el' 'or' 'yt'

获取子字符串

  • .str.get():获取字符串的某个位置的字符。

    s = pd.Series(['hello', 'world', 'python'])
    
    s.str.get(0)  # 'h' 'w' 'p'
    

字符串长度

  • .str.len():获取字符串的长度。

    s = pd.Series(['hello', 'world', 'python'])
    
    s.str.len()  # 5 5 6
    

正则表达式匹配

  • .str.match():检查字符串是否匹配正则表达式,并返回布尔值。

  • .str.contains():检查字符串是否包含正则表达式匹配的模式。

    s = pd.Series(['foo', 'bar', 'baz'])
    
    s.str.match('^ba')  # False True False
    s.str.contains('oo')  # True False False
    
  1. 编码和解码
  • .str.encode():将字符串编码为字节序列。

  • .str.decode():将字节序列解码为字符串。

    s = pd.Series(['hello', 'world', 'python'])
    
    s.str.encode('utf-8')  # b'hello' b'world' b'python'
    s.str.decode('utf-8')  # 'hello' 'world' 'python'
    

字符串重复

  • .str.repeat():重复字符串指定次数。

    s = pd.Series(['a', 'b', 'c'])
    
    s.str.repeat(3)  # 'aaa' 'bbb' 'ccc'
    

字符串格式化

  • .str.format():使用Python的字符串格式化方法。

    s = pd.Series(['{} {}'.format('foo', 'bar'), '{} {}'.format('baz', 'qux')])
    
    s.str.format('Hello, {}')  # 'Hello, foo bar' 'Hello, baz qux'
    

字符串查找和替换

  • .str.find():查找子字符串在字符串中的位置。

  • .str.rfind():从字符串末尾开始查找子字符串的位置。

    s = pd.Series(['foobar', 'bazqux', 'foobarbaz'])
    
    s.str.find('bar')  # 3 0 -1
    s.str.rfind('bar')  # 3 0 -1
    

字符串计数

  • .str.count():计算子字符串在字符串中出现的次数。

    s = pd.Series(['foo bar', 'baz qux', 'foo bar foo'])
    
    s.str.count('foo')  # 1 0 2
    

字符串比较

  • .str.eq():比较字符串是否相等。

  • .str.ne():比较字符串是否不相等。

  • .str.startswith():检查字符串是否以指定的子字符串开始。

  • .str.endswith():检查字符串是否以指定的子字符串结束。

    s = pd.Series(['foo', 'bar', 'baz'])
    
    s.str.eq('foo')  # True False False
    s.str.startswith('ba')  # False True False
    s.str.endswith('z')  # False False True