pandas第七章——文本数据

⼀、string类型的性质

1.string与object的区别

  1. object会随缺失值的存在而改变返回类型。
  2. 某些Series方法不在string上使用例如 Series.str.decode(),因为存储的是字串而不是字节。
  3. 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例,累计2432   -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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值