string与object的区别
string类型和object不同之处有三:
① 字符存取方法(string accessor methods,如str.count)会返回相应数据的Nullable类型,而object会随缺失值的存在而改变返回类型
② 某些Series方法不能在string上使用,例如: Series.str.decode(),因为存储的是字符串而不是字节
③ string类型在缺失值存储或运算时,类型会广播为pd.NA,而不是浮点型np.nan
string类型的转换
当下正确的方法是分两部转换,先转为str型object,在转为string类型:
import pandas as pd
import numpy as np
pd.Series([1,'1.']).astype('str').astype('string')
0 1
1 1.
dtype: string
主要有str.split和str.cat两种方法
拆分有 str.split方法,拼接用str.cat
str.split:
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s
0 a_b_c
1 c_d_e
2
3 f_g_h
dtype: string
s.str.split('_')
0 [a, b, c]
1 [c, d, e]
2
3 [f, g, h]
dtype: object
pd.Series(['a_b_c', ['a','b','c']]).str[1]
0 _
1 b
dtype: object
str.split方法中expand参数控制了是否将列拆开,n参数代表最多分割多少次
s.str.split('_',expand=True,n=1)
0 | 1 | |
---|---|---|
0 | a | b_c |
1 | c | d_e |
2 | ||
3 | f | g_h |
str.cat方法
s = pd.Series(['ab',None,'d'],dtype='string')
s
0 ab
1
2 d
dtype: string
s.str.cat()
'abd'
s.str.cat(na_rep='*')
'ab*d'
s2 = pd.Series(['24',None,None],dtype='string')
s2
s.str.cat(s2)
0 ab24
1
2
dtype: string
s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')
s2
1 a
2 b
3 c
dtype: string
广义上的替换,就是指str.replace函数的应用,fillna是针对缺失值的替换
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'],dtype="string")
s
0 A
1 B
2 C
3 Aaba
4 Baca
5
6
7 CABA
8 dog
9 cat
dtype: string
s.str.replace(r'^[AB]','***')#以A或者B开头的替换
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
str.replace的注意事项
首先,要明确str.replace和replace并不是一个东西:
str.replace针对的是object类型或string类型,默认是以正则表达式为操作,目前暂时不支持DataFrame上使用¶
replace针对的是任意类型的序列或数据框,如果要以正则表达式替换,需要设置regex=True,该方法通过字典可支持多列替换
主要有下面几种方法