內容目錄python
# 導入相關庫 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
使用 .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)
既然是在操做字符串,很天然,你可能會想到是否能夠從一個長的字符串中提取出子串。答案是能夠的。api
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
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
除了能夠匹配出子串外,咱們還可使用 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
這是一個神奇的功能,經過 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
這裏列出了一些經常使用的方法摘要。 方法 描述 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