Pandas文本数据类型
Pandas文本数据类型有object和string两种。
pandas1.0之前只有文本数据只有object类型,pandas1.01.0之后有了string类型。
如果一列数据中包含文本和数据,则会默认为object类型。
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A':['a','b','c','d'],
'B':['aa','bb','cc',np.nan],
'C':[1,2,3,4],
'D':[11,12,13,np.nan]
})
df.dtypes
A object
B object
C int64
D float64
dtype: object
如何将数据类型设定为string
分为两类:创建时设定和创建后设定。
pd.Series(["a","b","c"],dtype='string')
0 a
1 b
2 c
dtype: string
pd.Series(["a","b","c"],dtype=pd.StringDtype())
0 a
1 b
2 c
dtype: string
s=pd.Series(["a","b","c"])
s
0 a
1 b
2 c
dtype: object
s.astype('string')
0 a
1 b
2 c
dtype: string
df.dtypes
A object
B object
C int64
D float64
dtype: object
dfn = df.convert_dtypes()
dfn.dtypes
A string
B string
C Int64
D Int64
dtype: object
string和object的区别
区别1 :
统计字符串s.str.count()时,string类型的None返回 ,dtype为Int64
object类型的None返回NaN, dtpye为float64
不过通过dropna()去除None后,两者的dtype都是Int64。
也就是说无论Series或DataFrame含不含None,string类型的dtype都是Int64
但是Series或DataFrame含None,object的dtype是float64;不含None,object的dtype是Int64。
s= pd.Series(['a',None,'b'],dtype='string')
s.str.count('a')
0 1
1 <NA>
2 0
dtype: Int64
s.dropna().str.count('a')
0 1
2 0
dtype: Int64
s= pd.Series(['a',None,'b'],dtype='object')
s.str.count('a')
0 1.0
1 NaN
2 0.0
dtype: float64
s.dropna().str.count('a')
0 1
2 0
dtype: int64
区别2
通过str.isdigit ()检查字符串,如果为string类型,则返回布尔类型,dtype= boolean,None返回
如果为object类型,虽然返回是布尔类型,但是dtype= object, None返回 None
s= pd.Series(['a',None,'b','1'],dtype='string')
s.str.isdigit()
0 False
1 <NA>
2 False
3 True
dtype: boolean
s= pd.Series(['a',None,'b','1'],dtype='object')
s.str.isdigit()
0 False
1 None
2 False
3 True
dtype: object
字符串方法
文本格式转换
s = pd.Series(
['A','B','Aaba','Baca', np.nan, 'cat','This is apple','1',"我勒个去"],
dtype = 'string'
)
s.str.lower()
0 a
1 b
2 aaba
3 baca
4 <NA>
5 cat
6 this is apple
7 1
8 我勒个去
dtype: string
s.str.upper()
0 A
1 B
2 AABA
3 BACA
4 <NA>
5 CAT
6 THIS IS APPLE
7 1
8 我勒个去
dtype: string
s.str.title()
0 A
1 B
2 Aaba
3 Baca
4 <NA>
5 Cat
6 This Is Apple
7 1
8 我勒个去
dtype: string
0 A
1 B
2 Aaba
3 Baca
4 <NA>
5 Cat
6 This is apple
7 1
8 我勒个去
dtype: string
s.str.swapcase()
0 a
1 b
2 aABA
3 bACA
4 <NA>
5 CAT
6 tHIS IS APPLE
7 1
8 我勒个去
dtype: string
0 a
1 b
2 aaba
3 baca
4 <NA>
5 cat
6 this is apple
7 1
8 我勒个去
dtype: string
文本对齐
s.str.center(10,fillchar='-')
0 ----A-----
1 ----B-----
2 ---Aaba---
3 ---Baca---
4 <NA>
5 ---cat----
6 This is apple
7 ----1-----
8 ---我勒个去---
dtype: string
s.str.ljust(10,fillchar='!')
0 A!!!!!!!!!
1 B!!!!!!!!!
2 Aaba!!!!!!
3 Baca!!!!!!
4 <NA>
5 cat!!!!!!!
6 This is apple
7 1!!!!!!!!!
8 我勒个去!!!!!!
dtype: string
s.str.rjust(10,fillchar='+')
0 +++++++++A
1 +++++++++B
2 ++++++Aaba
3 ++++++Baca
4 <NA>
5 +++++++cat
6 This is apple
7 +++++++++1
8 ++++++我勒个去
dtype: string
s.str.pad(width=10,side='left',fillchar='☆')
0 ☆☆☆☆☆☆☆☆☆A
1 ☆☆☆☆☆☆☆☆☆B
2 ☆☆☆☆☆☆Aaba
3 ☆☆☆☆☆☆Baca
4 <NA>
5 ☆☆☆☆☆☆☆cat
6 This is apple
7 ☆☆☆☆☆☆☆☆☆1
8 ☆☆☆☆☆☆我勒个去
dtype: string
s.str.zfill(3)
0 00A
1 00B
2 Aaba
3 Baca
4 <NA>
5 cat
6 This is apple
7 001
8 我勒个去
dtype: string
计数与内容编码
s.str.count('a')
0 0
1 0
2 2
3 2
4 <NA>
5 1
6 1
7 0
8 0
dtype: Int64
s.str.len()
0 1
1 1
2 4
3 4
4 <NA>
5 3
6 13
7 1
8 4
dtype: Int64
s.str.encode('utf-8')
0 b'A'
1 b'B'
2 b'Aaba'
3 b'Baca'
4 <NA>
5 b'cat'
6 b'This is apple'
7 b'1'
8 b'\xe6\x88\x91\xe5\x8b\x92\xe4\xb8\xaa\xe5\x8e...
dtype: object
s.str.encode('utf-8').str.decode('utf-8')
0 A
1 B
2 Aaba
3 Baca
4 <NA>
5 cat
6 This is apple
7 1
8 我勒个去
dtype: object
格式判断
s.str.isalpha()
0 True
1 True
2 True
3 True
4 <NA>
5 True
6 False
7 False
8 True
dtype: boolean
s.str.isnumeric()
0 False
1 False
2 False
3 False
4 <NA>
5 False
6 False
7 True
8 False
dtype: boolean
s.str.isalnum()
0 True
1 True
2 True
3 True
4 <NA>
5 True
6 False
7 True
8 True
dtype: boolean
0 False1 False2 False3 False4 <NA>5 False6 False7 True8 Falsedtype: boolean
0 False
1 False
2 False
3 False
4 <NA>
5 False
6 False
7 True
8 False
dtype: boolean
s.str.isspace()
0 False
1 False
2 False
3 False
4 <NA>
5 False
6 False
7 False
8 False
dtype: boolean
s.str.islower()
0 False1 False2 False3 False4 <NA>5 True6 False7 False8 Falsedtype: boolean
0 True1 True2 False3 False4 <NA>5 False6 False7 False8 Falsedtype: boolean
0 True1 True2 True3 True4 <NA>5 False6 False7 False8 Falsedtype: boolean
文本高级操作
文本拆分
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
s.str.split("_").str.get(1)
0 b
1 d
2 <NA>
3 g
dtype: object
s.str.split('_').str[0]
0 a1 c2 <NA>3 fdtype: object
0 | 1 | 2 |
0 | a | b | c |
1 | c | d | e |
2 | <NA> | <NA> | <NA> |
3 | f | g | h |
s.str.split('_',n=1)
0 [a, b_c]1 [c, d_e]2 <NA>3 [f, g_h]dtype: object
s.str.split('_',expand=True,n=1)
0 | 1 |
0 | a | b_c |
1 | c | d_e |
2 | <NA> | <NA> |
3 | f | g_h |
0 | 1 |
0 | a_b | c |
1 | c_d | e |
2 | <NA> | <NA> |
3 | f_g | h |
文本替换
s = pd.Series(['us $66.8', 'us $56.8', 'us $112.9'],
dtype='string')
s.str.replace(r'us \$','',regex=True)
0 66.8
1 56.8
2 112.9
dtype: string
s.str.replace('us $','',regex=False)
0 66.8
1 56.8
2 112.9
dtype: string
0 foo 123
1 bar baz
2 <NA>
dtype: string
pat = r'[a-z]+'
def repl(m):
return m.group(0)[::-1]
s.str.replace(pat, repl, regex=True)
0 oof 123
1 rab zab
2 <NA>
dtype: string
'foo'
re.match(pat,'foo 123')[0][::-1]
'oof'
repl(re.match(pat,'foo 123'))
'oof'
s = pd.Series(['ax','bxy','cxyz'])
s
0 ax
1 bxy
2 cxyz
dtype: object
s.str.slice_replace(1,repl='T')
0 aT
1 bT
2 cT
dtype: object
0 aT1 bT2 cTzdtype: object
0 axax1 bxybxy2 cxyzcxyzdtype: object
文本拼接
s = pd.Series(['a','b',np.nan,'d'],
dtype='string')
s
0 a
1 b
2 <NA>
3 d
dtype: string
s.str.cat()
'abd'
s.str.cat(sep='-')
'a-b-d'
s.str.cat(sep='-', na_rep='空值')
'a-b-空值-d'
s.str.cat(['A','B','C','D'], sep='+')
0 a+A
1 b+B
2 <NA>
3 d+D
dtype: string
s.str.cat(['A','B','C','D'], sep='+', na_rep='-')
0 a+A1 b+B2 -+C3 d+Ddtype: string
d = pd.concat([t,s],axis=1)d
0 | 1 |
0 | A | a |
1 | B | b |
2 | C | <NA> |
3 | D | d |
s.str.cat(d,na_rep='-')
0 aAa1 bBb2 -C-3 dDddtype: string
1 b3 d0 a2 cdtype: string
s
0 a1 b2 <NA>3 ddtype: string
s.str.cat(u,na_rep='空值')
0 aa1 bb2 空值c3 dddtype: string
-1 z
0 a
1 b
3 d
4 e
dtype: string
s
0 a
1 b
2 <NA>
3 d
dtype: string
s.str.cat(v,join='right')
-1 <NA>
0 aa
1 bb
3 dd
4 <NA>
dtype: string
文本匹配
文本查询
s = pd.Series(['中国','中国山东','中国河南','中国河北','中国辽宁','莫斯科'])
s
0 中国
1 中国山东
2 中国河南
3 中国河北
4 中国辽宁
5 莫斯科
dtype: object
s.str.findall('中国')
0 [中国]
1 [中国]
2 [中国]
3 [中国]
4 [中国]
5 []
dtype: object
s.str.find('中国')
0 0
1 0
2 0
3 0
4 0
5 -1
dtype: int64
s.str.find('国')
0 1
1 1
2 1
3 1
4 1
5 -1
dtype: int64
文本包含
s
0 中国
1 中国山东
2 中国河南
3 中国河北
4 中国辽宁
5 莫斯科
dtype: object
s.str.contains('中国')
0 True
1 True
2 True
3 True
4 True
5 False
dtype: bool
s.str.contains('中国|莫')
0 True
1 True
2 True
3 True
4 True
5 True
dtype: bool
文本提取
s =pd.Series(['a1e3','b2f6','c3o7','a3c4'],
dtype='string')
s
0 a1e3
1 b2f6
2 c3o7
3 a3c4
dtype: string
s.str.extract(r'([a-z]+(\d)[a-z]+(\d))',expand=False)
0 | 1 | 2 |
0 | a1e3 | 1 | 3 |
1 | b2f6 | 2 | 6 |
2 | c3o7 | 3 | 7 |
3 | a3c4 | 3 | 4 |
s.str.extract(r'[a-z]+(\d)[a-z]+(\d)',expand=True)
0 | 1 |
0 | 1 | 3 |
1 | 2 | 6 |
2 | 3 | 7 |
3 | 3 | 4 |
s.str.extract(r'[a-z]+(\d)[a-z]+(\d)',expand=False)
0 | 1 |
0 | 1 | 3 |
1 | 2 | 6 |
2 | 3 | 7 |
3 | 3 | 4 |
s.str.extract('([a-z]+)\d+([a-z])+\d+',expand=False)
0 | 1 |
0 | a | e |
1 | b | f |
2 | c | o |
3 | a | c |
s.str.extract(r'(?P<ab字母列>[ab])(?P<数字列>\d)',
expand=False)
ab字母列 | 数字列 |
0 | a | 1 |
1 | b | 2 |
2 | <NA> | <NA> |
3 | a | 3 |
s = pd.Series(['a1a2','b1','c1'],
index=['A','B','C'],
dtype='string')
s
A a1a2
B b1
C c1
dtype: string
two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extract(two_groups, expand=True)
letter | digit |
A | a | 1 |
B | b | 1 |
C | c | 1 |
s.str.extractall(two_groups)
letter | digit |
match |
A | 0 | a | 1 |
1 | a | 2 |
B | 0 | b | 1 |
C | 0 | c | 1 |
s = pd.Series(['a','a|b',np.nan,'a|c'],
dtype='string')
s
0 a
1 a|b
2 <NA>
3 a|c
dtype: string
s.str.get_dummies(sep='|')
a | b | c |
0 | 1 | 0 | 0 |
1 | 1 | 1 | 0 |
2 | 0 | 0 | 0 |
3 | 1 | 0 | 1 |