4-Pandas數據預處理之數據轉換(文本數據規整)


說明:本片博文接上篇博文【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

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM