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的一個list
,print
一下也可以看出來。
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並沒有那麼整潔,會出現下面這種情況。
這種情況看似比較棘手,但是用正則就很容易。
data['當前學院']=data['當前學院'].str.replace('學$','學院')
你,學會了嗎?