⼀、string类型的性质
1.string与object的区别
- object会随缺失值的存在而改变返回类型。
- 某些Series方法不在string上使用例如 Series.str.decode(),因为存储的是字串而不是字节。
- string类型在缺失值存储或运算时类型会广播为pd.NA,而不是浮点型np.nan。
其余内容完全相同,但为了迎合pandas的发展模式,仍然用string操作字符串
2.string类型的转换
先转为str型object,再转为string类型
pd.Series([1,'1.']).astype('str').astype('string')
0 1
1 1.
dtype: string
二、拆分与拼接
1. str.split方法
拆分
分割参数的选取
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 <NA>
3 [f, g, h]
dtype: object
expand参数
控制是否将列分开,n参数代表分开多少次
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s.str.split('_',expand=True)
0 1 2
0 a b c
1 c d e
2 <NA> <NA> <NA>
3 f g h
2. str.cat方法
拼接
s = pd.Series(['ab',None,'d'],dtype='string')
s.str.cat()
abd
sep间隔参数和缺失值替代字符na_rep参数
s.str.cat(sep=',',na_rep='*')
ab,*,d
两个Series通过索引合并
s2 = pd.Series(['24',None,None],dtype='string')
s.str.cat(s2)
0 ab24
1 <NA>
2 <NA>
dtype: string
三、替换
1. str.replace的常见用法
第⼀个值写r开头的正则表达式后一个写替换的字符串
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 <NA>
7 CABA
8 dog
9 cat
dtype: string
四、子串匹配与提取
1. str.extract方法
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<name_1>[\d]{2})-(?P<name_2>[\d]{2})')
name_1 name_2
0 10 87
1 10 88
2 <NA> <NA>
利⽤?正则标记选择部分提取
pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})?-(?P<name_2>[\d]{2})')
name_1 name_2
0 10 87
1 10 88
2 <NA> 89
expand参数
控制是否将列分开
2. str.extractall方法
extractall会找出所有符合条件的字符串并建立多级索引
s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")
two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extractall(two_groups)
letter digit
match
A 0 a 1
1 a 2
B 0 b 1
C 0 c 1
如果想看第i层可使用xs方法
s = pd.Series(["a1a2", "b1b2", "c1c2"], index=["A", "B", "C"],dtype="string")
two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extractall(two_groups).xs(1,level='match')
letter digit
A a 2
B b 2
C c 2
五、常用字符串方法
str.strip() #常用于过滤空格
str.lower() #变为小写
str.upper() #变为大写
str.swapcase() #交换大小写
str.capitalize()#大小写首字母
str.isnumeric() #检查每一位是否为数字
练习
a
df[df['col1'].str.contains(r'[北京]{2}|[上海]{2}')].head()
col1 col2 col3
4 上海开学日期延至3月 -95 4.05
6 上海新增10例,累计243例 2 -73.7105
36 上海新增14例累计233例 -55 -83
40 上海新增14例累计233例 -88 -99
53 上海7个月大婴儿确诊 -71 -391.2325
b
有几个数据有问题需要替换
df['col2'][~(df['col2'].str.replace(r'-?\d+','True')=='True')]
df.loc[[309,396,485],'col2'] = [0,9,7]
df['col2'].astype('int').mean()
-0.984
c
有几个数据有问题需要替换
df.columns = df.columns.str.strip()
df['col3'][~(df['col3'].str.replace(r'-?\d+\.?\d+','True')=='True')]
df.loc[[28,122,332],'col3'] = [355.3567,9056.2253, 3534.6554]
c=df['col3'].astype('float').mean()
24.707484999999988