Pandas系列(四)-文本数据处理

内容目录python

  • 1. 为何要用str属性
  • 2. 替换和分割
  • 3. 提取子串
    • 3.1 提取第一个匹配的子串
    • 3.2 匹配全部子串
    • 3.3 测试是否包含子串
    • 3.4 生成哑变量
    • 3.5 方法摘要

 1、为何要用str属性?

# 导入相关库
import numpy as np
import pandas as pd

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")
data = {
    "age": [18, 30, np.nan, 40, np.nan, 30],
    "city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen", np.nan, " "],
    "sex": [None, "male", "female", "male", np.nan, "unknown"],
    "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
}
user_info = pd.DataFrame(data=data, index=index)
# 将出生日期转为时间戳
user_info["birth"] = pd.to_datetime(user_info.birth)
user_info
Out[203]: 
        age        city      sex      birth
name                                       
Tom    18.0   Bei Jing      None 2000-02-10
Bob    30.0  Shang Hai      male 1988-10-17
Mary    NaN  Guang Zhou   female        NaT
James  40.0   Shen Zhen     male 1978-08-08
Andy    NaN         NaN      NaN        NaT
Alice  30.0              unknown 1988-10-17  

  在以前已经了解过,在对 Series 中每一个元素处理时,咱们可使用 map 或 apply 方法。好比,我想要将每一个城市都转为小写,可使用以下的方式。git

In [3]: user_info.city.map(lambda x:x.lower())#报错
-------------------------------------------------------------------------
AttributeError                            Traceback (most recent call las
<ipython-input-3-d3c01aca317c> in <module>()
----> 1 user_info.city.map(lambda x:x.lower())#报错

d:\pytho3.6\lib\site-packages\pandas\core\series.py in map(self, arg, na_

   2996         """
   2997         new_values = super(Series, self)._map_values(
-> 2998             arg, na_action=na_action)
   2999         return self._constructor(new_values,
   3000                                  index=self.index).__finalize__(s

d:\pytho3.6\lib\site-packages\pandas\core\base.py in _map_values(self, ma
a_action)
   1002
   1003         # mapper is a function
-> 1004         new_values = map_f(values, mapper)
   1005
   1006         return new_values

pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer()

<ipython-input-3-d3c01aca317c> in <lambda>(x)
----> 1 user_info.city.map(lambda x:x.lower())#报错

AttributeError: 'float' object has no attribute 'lower'

In [4]: user_info.city.str.lower()
Out[4]:
name
Tom       bei jing
Bob      shang hai
Mary     guang zhou
James     shen zhen
Andy            NaN
Alice
Name: city, dtype: object

In [5]: user_info.city.str.len()#字符串能用len,series,dataframe用size
Out[5]:
name
Tom       9.0
Bob      10.0
Mary     10.0
James     9.0
Andy      NaN
Alice     1.0
Name: city, dtype: float64

2、替换和分割

使用 .srt 属性也支持替换与分割操做。
先来看下替换操做,例如:将空字符串替换成下划线。
replace 方法还支持正则表达式,例如将全部开头为 S 的城市替换为空字符串。
再来看下分割操做,例如根据空字符串来分割某一列。
分割列表中的元素可使用 get 或 [] 符号进行访问:
设置参数 expand=True 能够轻松扩展此项以返回 DataFrame。正则表达式

user_info.city.str.replace(' ','_')
user_info.city.str.replace('^S.*','')
user_info.city.str.split(" ")
user_info.city.str.split(" ").str.get(0)
user_info.city.str.split(" ").str[1]
user_info.city.str.split(" ", expand=True)

3、提取子串

  既然是在操做字符串,很天然,你可能会想到是否能够从一个长的字符串中提取出子串。答案是能够的。api

  • 3.1 提取第一个匹配的子串

  extract 方法接受一个正则表达式并至少包含一个捕获组,指定参数 expand=True 能够保证每次都返回 DataFrame。
  例如,如今想要匹配空字符串前面的全部的字母,可使用以下操做:若是使用多个组提取正则表达式会返回一个 DataFrame,每一个组只有一列。数组

In [6]: user_info.city.str.extract("(\w+)\s+", expand=True)
Out[6]:
           0
name
Tom      Bei
Bob    Shang
Mary   Guang
James   Shen
Andy     NaN
Alice    NaN

  例如,想要匹配出空字符串前面和后面的全部字母,操做以下app

In [7]: user_info.city.str.extract("(\w+)\s+(\w+)", expand=True)
Out[7]:
           0     1
name
Tom      Bei  Jing
Bob    Shang   Hai
Mary   Guang  Zhou
James   Shen  Zhen
Andy     NaN   NaN
Alice    NaN   NaN
  • 3.2 匹配全部子串

  extract 只可以匹配出第一个子串,使用 extractall 能够匹配出全部的子串。
  例如,将全部组的空白字符串前面的字母都匹配出来,能够以下操做。测试

In [8]: user_info.city.str.extractall("(\w+)\s+")
Out[8]:
                 0
name  match
Tom   0        Bei
      1       Jing
Bob   0      Shang
      1        Hai
Mary  0      Guang
James 0       Shen
  • 3.3 测试是否包含子串

除了能够匹配出子串外,咱们还可使用 contains 来测试是否包含子串。例如,想要测试城市是否包含子串 “Zh”。spa

In [9]: user_info.city.str.contains("Zh")
Out[9]:
name
Tom      False
Bob      False
Mary      True
James     True
Andy       NaN
Alice    False
Name: city, dtype: object
In [10]: user_info.city.str.contains("^S")
Out[10]:
name
Tom      False
Bob       True
Mary     False
James     True
Andy       NaN
Alice    False
Name: city, dtype: object
  • 3.4 生成哑变量

这是一个神奇的功能,经过 get_dummies 方法能够将字符串转为哑变量,sep 参数是指定哑变量之间的分隔符。来看看效果吧。code

In [11]: user_info.city.str.get_dummies(sep=" ")
Out[11]:
       Bei  Guang  Hai  Jing  Shang  Shen  Zhen  Zhou
name
Tom      1      0    0     1      0     0     0     0
Bob      0      0    1     0      1     0     0     0
Mary     0      1    0     0      0     0     0     1
James    0      0    0     0      0     1     1     0
Andy     0      0    0     0      0     0     0     0
Alice    0      0    0     0      0     0     0     0
  • 3.5 方法摘要  
这里列出了一些经常使用的方法摘要。

方法	描述
cat()	链接字符串
split()	在分隔符上分割字符串
rsplit()	从字符串末尾开始分隔字符串
get()	索引到每一个元素(检索第i个元素)
join()	使用分隔符在系列的每一个元素中加入字符串
get_dummies()	在分隔符上分割字符串,返回虚拟变量的DataFrame
contains()	若是每一个字符串都包含pattern / regex,则返回布尔数组
replace()	用其余字符串替换pattern / regex的出现
repeat()	重复值(s.str.repeat(3)等同于x * 3 t2 >)
pad()	将空格添加到字符串的左侧,右侧或两侧
center()	至关于str.center
ljust()	至关于str.ljust
rjust()	至关于str.rjust
zfill()	等同于str.zfill
wrap()	将长长的字符串拆分为长度小于给定宽度的行
slice()	切分Series中的每一个字符串
slice_replace()	用传递的值替换每一个字符串中的切片
count()	计数模式的发生
startswith()	至关于每一个元素的str.startswith(pat)
endswith()	至关于每一个元素的str.endswith(pat)
findall()	计算每一个字符串的全部模式/正则表达式的列表
match()	在每一个元素上调用re.match,返回匹配的组做为列表
extract()	在每一个元素上调用re.search,为每一个元素返回一行DataFrame,为每一个正则表达式捕获组返回一列
extractall()	在每一个元素上调用re.findall,为每一个匹配返回一行DataFrame,为每一个正则表达式捕获组返回一列
len()	计算字符串长度
strip()	至关于str.strip
rstrip()	至关于str.rstrip
lstrip()	至关于str.lstrip
partition()	等同于str.partition
rpartition()	等同于str.rpartition
lower()	至关于str.lower
upper()	至关于str.upper
find()	至关于str.find
rfind()	至关于str.rfind
index()	至关于str.index
rindex()	至关于str.rindex
capitalize()	至关于str.capitalize
swapcase()	至关于str.swapcase
normalize()	返回Unicode标准格式。至关于unicodedata.normalize
translate()	等同于str.translate
isalnum()	等同于str.isalnum
isalpha()	等同于str.isalpha
isdigit()	至关于str.isdigit
isspace()	等同于str.isspace
islower()	至关于str.islower
isupper()	至关于str.isupper
istitle()	至关于str.istitle
isnumeric()	至关于str.isnumeric
isdecimal()	至关于str.isdecimal
相关文章
相关标签/搜索