說明:本片博文接上篇博文【Pandas數據預處理之數據轉換(啞變量編碼pd.get_dummies())】以及上上篇博文【 Pandas數據預處理之數據轉換(df.map()、df.replace())】
Pandas對於字符串和文本處理通常是由一些內置的字符串方法指定,一般語法格式為:series.str.method。其中,str.method被稱為矢量化的字符串方法,包括str.upper()、str.lower()、str.split()等一系列字符串的內置方法,還可以結合正則化式進行處理。
(1)矢量化的字符串方法將對Series或者Index中的每個元素都進行相同的處理;
說明:缺失值不做任何處理
>>> s = pd.Series(['ADJruK','hjuQ',np.nan,'hj']) >>> s 0 ADJruK 1 hjuQ 2 NaN 3 hj dtype: object >>> s.str.upper() 0 ADJRUK 1 HJUQ 2 NaN 3 HJ dtype: object
(2)對於Index對象也可以使用矢量化字符串的處理方式;
>>> df = pd.DataFrame(np.random.randint(10,size=(2,3)),columns=['Jack Joe','BOB Marly','sid Jane']) >>> df Jack Joe BOB Marly sid Jane 0 4 1 4 1 9 1 8 #將所有列名轉化為小寫 >>> df.columns = df.columns.str.lower() >>> df jack joe bob marly sid jane 0 4 1 4 1 9 1 8
(3)鏈式法則(chain rules):將多個數據規整寫在一行代碼中;
#將所有列名轉化為小寫,再使用下划線代替空格 >>> df.columns = df.columns.str.lower().str.replace(' ','_') >>> df jack_joe bob_marly sid_jane 0 4 1 4 1 9 1 8
(4)分割元素:str.split()可以將一個Series對象規整為包含多個Series對象或DataFrame對象;
例:需求為提取每個元素的姓名---使用str.get方法或世界在str上進行索引
#創建一個Series對象 >>> ss = pd.Series(['name1 sex1 age1','name2 sex2 age2','name3 sex3 age3']) >>> ss 0 name1 sex1 age1 1 name2 sex2 age2 2 name3 sex3 age3 dtype: object >>> new_ss = ss.str.split(" ") >>> new_ss 0 [name1, sex1, age1] 1 [name2, sex2, age2] 2 [name3, sex3, age3] >>> type(new_ss) <class 'pandas.core.series.Series'> >>> new_ss.shape (3,) >>> new_ss[0] ['name1', 'sex1', 'age1'] #方法一:直接在str屬性上使用索引(即str[]),即可提取每個樣本的姓名 >>> new_ss.str[0] 0 name1 1 name2 2 name3 dtype: object #方法二:使用str.get方法(即str.get()),即可提取每個樣本的姓名 >>> new_ss.str.get(0) 0 name1 1 name2 2 name3 dtype: object
若需要將分隔開的元素規整成一個DataFrame,可以使用expand參數將分隔開的各個部分展開
>>> ss.str.split(" ",expand = True) 0 1 2 0 name1 sex1 age1 1 name2 sex2 age2 2 name3 sex3 age3
(5)結合正則表達式
Series.str屬性結合正則表達式可以匹配一定模式的字符的換的提取、判斷、替換等操作。
這些矢量化的字符串包括str.contains(查看是否包含指定的信息)、str.findall(提取指定的信息)、str.match、str.relpace(替換)和str.extract(指定捕獲組以提取某信息)等等
以爬取的“58同城網重慶市南岸區二手房數據中的樓層數(floors)”為例。
>>> data = pd.read_csv('./input/data.csv',encoding = 'utf8') >>> data = data['floors'] >>> data.head() 0 中層(共16層) 1 中層(共31層) 2 中層(共33層) 3 中層(共33層) 4 高層(共28層) Name: floors, dtype: object
使用str.contains()找到其中包含數字的元素
>>> data.str.contains(r'\d')[:5] 0 True 1 True 2 True 3 True 4 True
使用str.repalce()對樓層進行加密(即將數字替換成'XX')
>>> data.str.replace(r'\d.','XX')[:5] 0 中層(共XX層) 1 中層(共XX層) 2 中層(共XX層) 3 中層(共XX層) 4 高層(共XX層) Name: floors, dtype: object
使用str.findall()提取其中的數字
>>> data.str.findall(r'\d.').str.get(0)[:5] 0 16 1 31 2 33 3 33 4 28 Name: floors, dtype: object
使用str.extract()指定捕獲組以直接提取數字
>>> data.str.extract(r'(\d.)',expand=False)[:5] 0 16 1 31 2 33 3 33 4 28 Name: floors, dtype: object
(6)對多個標簽樣本進行啞變量編碼
使用str屬性進行啞變量編碼,並使用sep指定分隔符
>>> s = pd.Series(["Animation,Children's,Comedy","Comedy,Romance","Animation","Comedy"]) >>> s 0 Animation,Children's,Comedy 1 Comedy,Romance 2 Animation 3 Comedy #對多個標簽進行啞變量編碼 >>> s.str.get_dummies(sep=',') Animation Children's Comedy Romance 0 1 1 1 0 1 0 0 1 1 2 1 0 0 0 3 0 0 1 0