1. string与object的区别
(1)字符存取方法会返回相应数据的Nullable类型,而object会岁缺失值的存在而改变返回类型
(2) 某些Series方法不能用在string上,例如:Series.str.decode(),存储的是字符串而不是字节
(3)string类型在缺失值存储或运算时,类型会广播为pd.NA,而不是浮点型np.nan
2. string类型的转换
如果将一个其他类型的容器直接转换string类型可能会出错。当下正确的方法是分两部转换,先转为str型object,再转为string类型。str是将该对象转换成字符串类型,string是该对象原本就是字符串。
pd.Series([1,'1.']).astype('str').astype('string')
pd.Series([1,2]).astype('str').astype('string')
pd.Series([True,False]).astype('str').astype('string')
上述代码分别是将object型、int型、bool型分两步转换为string类型。直接转会报错。
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s.str.split('_')
结果:
0 [a, b, c]
1 [c, d, e]
2
3 [f, g, h]
dtype: object
对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出
s.str.split('_').str[1]
pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1]
s.str.split('_',expand=True)
s.str.split('_',n=1)
0 [a, b_c]
1 [c, d_e]
2
3 [f, g_h]
dtype: object
s.str.split('_',expand=True,n=1)
s = pd.Series(['ab',None,'d'],dtype='string')
s.str.cat()
‘abc’
s.str.cat(sep=',')
结果:
‘ab,d’
s.str.cat(sep=',',na_rep='*')
结果:
‘ab,*,d’
s2 = pd.Series(['24',None,None],dtype='string')
s.str.cat(s2)
结果:
0 ab24
1
2
dtype: string
s.str.cat(s2,sep=',',na_rep='*')
结果:
0 ab,24
1 ,
2 d,*
dtype: string
s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')
结果:
0 ab15
1 3b
2 d5
dtype: string
s.str.cat([s+'0',s*2])
结果:
0 abab0abab
1
2 dd0dd
dtype: string
s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')
s.str.cat(s2,na_rep='*')
结果:
0 ab*
1 *a
2 db
dtype: string
python详解正则表达式
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'],dtype="string")
s.str.replace(r'^[AB]','***')
结果:
0 ***
1 ***
2 C
3 ***aba
4 ***aca
5
6
7 CABA
8 dog
9 cat
dtype: string
s.str.replace(r'([ABC])(\w+)',lambda x:x.group(2)[1:]+'*')
结果:
0 A
1 B
2 C
3 ba*
4 ca*
5
6
7 BA*
8 dog
9 cat
dtype: string
s.str.replace(r'(?P[ABC])(?P\w+)' ,lambda x:x.group('two')[1:]+'*')
结果:
0 A
1 B
2 C
3 ba*
4 ca*
5
6
7 BA*
8 dog
9 cat
dtype: string
#pd.Series([‘A’,‘B’],dtype=‘string’).str.replace(r’[A]’,pd.NA) #报错
#pd.Series([‘A’,‘B’],dtype=‘O’).str.replace(r’[A]’,pd.NA) #报错
pd.Series(['A','B'],dtype='string').astype('O').replace(r'[A]',pd.NA,regex=True).astype('string')
结果:
0
1 B
dtype: string
pd.Series(['A','B'],dtype='string').replace(r'[A]','C',regex=True)
结果:
0 A
1 B
dtype: string
pd.Series(['A','B'],dtype='O').replace(r'[A]','C',regex=True)
结果:
0 C
1 B
dtype: object
pd.Series(['A',np.nan],dtype='string').str.replace('A','B')
结果:
0 B
1
dtype: string
pd.Series(['10-87', '10-88', '10-89'],dtype="string").str.extract(r'([\d]{2})-([\d]{2})')
结果:
| | 0 | 1 |
|0–|-10-|87 |
|1 |10 |88 |
|2 |10 |89 |
pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P[\d]{2})-(?P[\d]{2})'
],dtype="string").str.extract(r'(?P[\d]{2})?-(?P[\d]{2})' )
pd.Series(['10-87', '10-88', '10-'],dtype="string").str.extract(r'(?P[\d]{2})-(?P[\d]{2})?' )
s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"], dtype="string")
s.index
结果:
Index([‘A11’, ‘B22’, ‘C33’], dtype=‘object’)
s.str.extract(r'([\w])')
| |0 |
|A11|a|
|B22 | b |
|C33 | c |
s.str.extract(r'([\w])',expand=False)
结果:
A11 a
B22 b
C33 c
dtype: string
s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")
two_groups = '(?P[a-z])(?P[0-9])'
s.str.extract(two_groups, expand=True)
s.str.extractall(two_groups)
pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains(r'[0-9][a-z]')
结果:
0 False
1
2 True
3 True
4 True
dtype: boolean
pd.Series(list('abc'),index=[' space1 ','space2 ',' space3'],dtype="string").index.str.strip()
结果:
Index([‘space1’, ‘space2’, ‘space3’], dtype=‘object’)
表示字母大小写
pd.Series(['1.2','1','-0.3','a',np.nan],dtype="string").str.isnumeric()
结果:
0 False
1 True
2 False
3 False
4
dtype: boolean