1. 程式人生 > 其它 >delphi字串中引號處理_pandas與numpy中的字串處理

delphi字串中引號處理_pandas與numpy中的字串處理

技術標籤:delphi字串中引號處理

pandas與numpy中的字串處理

昨日問題解答

昨天留了一個小問題,不知道大家想清楚了沒有?

其實np.apply_along_axis實現的也是軸上的操作,對軸上的值統一用函式進行處理,然後返回值。

import numpy as nparray = np.array([['hello world','sssimon yang']])
np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=0,arr=array)

out:

array([['hello', 'sssim']], dtype=')

在這一步中,處理的是第一個軸,第一個軸有1個值,剩下的還有一個軸,維度為2,所以處理了兩次。

應該記住,每次指定的axis都是可能要發生改變的軸,指定的軸有1個值,所以送入函式的有1個值,剩下的維度就是送入的次數。

所以函式每次拿到的是長度為1的一個listprint一下也可以看出來。

np.apply_along_axis(lambda a:print(a),axis=0,arr=array)
['hello world']['sssimon yang']

out:

array([None, None], dtype=object)

用下面的例子會看的更容易些。

data = np.arange(0, 24).reshape((2,3,4))np.apply_along_axis(lambda a:print(a),axis=1,arr=data)
[0 4 8][1 5 9][ 2  6 10][ 3  7 11][12 16 20][13 17 21][14 18 22][15 19 23]

out:

array([[None, None, None, None],       [None, None, None, None]], dtype=object)

處理的是第二個軸,每次送入三個值,剩下的維度為2X4,所以送入8次,這8次的每三個值都是依次遍歷第一層1,2和最後一層1,2,3,4提取組成的。最後再組成一個2X4的ndarray。

data = np.arange(0, 24).reshape((2,3,4))np.apply_along_axis(lambda a:np.mean(a),axis=1,arr=data)

out:

array([[ 4.,  5.,  6.,  7.],       [16., 17., 18., 19.]])

回到之前。

np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=1,arr=array)

out:

array([['hello','sssimon']],dtype=')

axis=1時,顯然送入函式的就是一個長度為2的list,送入了一次。

那麼問題就出在處理的次數上。

axis=0的時候,兩個字串是分兩次處理的,在第一次返回['hello']的時候,因為函式只返回一個值,所以numpy從中提取'hello'並由此獲知返回的資料型別為<是小端儲存的意思,U表明該字串為unicode字元,5表明長度為5,而我們知道numpy中所有的資料型別都是一致的。所以當第二次返回['sssimon']的時候,numpy也拿到了'sssimon'並存儲了,但是由於numpy在輸出的時候是根據資料型別進行輸出的,型別為,所以只輸出了5個字元。

axis=1的時候,返回的是列表['hello', 'sssimon'],numpy自動根據列表裡最長的字串進行型別推斷,為,也就不會出現輸出時的截斷操作。這就是造成兩者差異的原因,其實從給出的dtype中也可以看出來一些線索。

字串處理

pandas和numpy中都有字串處理的模組,pandas在pd.Series.str模組裡,而numpy在np.char模組裡。

data = pd.DataFrame({'name':['sssimon yang','edward wang'],'age':[18,22]})

pd.Series.str是直接可以用切片操作的。

data.name.str[-4:]

out:

0    yang1    wangName:name,dtype:object

str模組實現了例如endswith,startswith,len,strip等基礎字串的常用函式。

當然我比較常用的就是replace,裡面還可以用正則表示式。

data.name.str.replace('.ang','zhang')

out:

0    sssimon zhang1     edward zhangName:name,dtype:object

我們可以用內建的split完成類似之前的拆分。

data.name.str.split()

out:

0    [sssimon, yang]1     [edward, yang]Name:name,dtype:object

拆分後返回的是list,dtype為object,我們可以借用str的切片操作來提取一下第一個值。

data.name.str.split().str[0]

out:

0    sssimon1     edwardName: name, dtype: object

成功了!

當然其實用apply函式更簡單直觀一點。

data.name.apply(lambda x:x.split()[0])

out:

0    sssimon1     edwardName: name, dtype: object

pandas中字串處理只在series中可用,而numpy沒有這個限制,因為numpy內部儲存的全都是同一種類型。

np.char模組也實現了常用的lower,strip,replace,decode,encode,add等函式,其本質上都是對單元素或者多元素呼叫函式,函式比較少,感覺不如pandas中的字串處理靈活性大。

最後

字串處理在資料分析中常用於資料清洗過程,例如在分析轉專業資料時,我拿到的pdf識別後的excel並沒有那麼整潔,會出現下面這種情況。

a1ff67fcf10c042935e0d385e3338a0e.png

這種情況看似比較棘手,但是用正則就很容易。

data['當前學院']=data['當前學院'].str.replace('學$','學院')

你,學會了嗎?