Python数据分析_Pandas07_字符串数据

str属性

str属性只对series。

可以用来对数据框的列名和文字列进行操作。

常用操作

s = pd.Series(['A', 'B', 'C', 'Aaba ', 'Baca ', np.nan, ' CABA', 'dog', 'cat'])
s.str.lower()
s.str.upper()
s.str.len()

s.str.strip()
s.str.lstrip()
s.str.rstrip()
s.str.replace(' ','_')

分割

分割str.split(' '),括号中是分割依据的字符串。

选取分割后的一部分,有两种方法:

  1. str.split(' ').get(0)
  2. str.split(' ').str[0]
In [5]: s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])

In [6]: s2.str.split('_')
Out[6]:
0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]
dtype: object

In [7]: s2.str.split('_').str.get(1)
Out[7]:
0      b
1      d
2    NaN
3      g
dtype: object

In [8]: s2.str.split('_').str[1]
Out[8]:
0      b
1      d
2    NaN
3      g
dtype: object

expand=True参数将字符串拆分成多列,返回一个数据框。

n=1参数指定拆分次数。str.split()默认从左向右拆分,str.rsplit()从右往左拆分。

In [9]: s2.str.split('_', expand=True)
Out[9]:
     0     1     2
0    a     b     c
1    c     d     e
2  NaN  None  None
3    f     g     h

In [12]: s2.str.rsplit('_', expand=True, n=1)
Out[12]:
     0     1
0  a_b     c
1  c_d     e
2  NaN  None
3  f_g     h

替换

replace,findall可以接受正则表达式。要注意正则表达式中的元字符,如$|^|.|?,等,给它们加上\进行转义。

In [13]: s3 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca',
    ...:                 '', np.nan, 'CABA', 'dog', 'cat'])

In [14]: s3.str.replace('^.a|dog', 'XX_', case=False)
Out[14]:
0        A
1        B
2        C
3    XX_ba
4    XX_ca
5
6      NaN
7    XX_BA
8      XX_
9     XX_t
dtype: object
# '^.a|dog' == 以(.)任意字符+a 或 dog (^)开头的字符串
# case=False 不区分大小写

选取字符串数据

可以用str[n]来选择一列字符串中的第n个字符,没有的显示NaN。

In [15]: s4 = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan,
    ...:                 'CABA', 'dog', 'cat'])
    ...: s4.str[1]
    ...:
Out[15]:
0    NaN
1    NaN
2    NaN
3      a
4      a
5    NaN
6      A
7      o
8      a
dtype: object

提取

返回第一个匹配成功的字符串:str.extract(regex, expand=False)

expand=True返回dataframe。expand=False返回Series/Index/DataFrame,如果只匹配到一列返回series,匹配不到返回index,匹配多列dataframe。默认False。

最好加上expand参数,不然会有FuturaWarning。

给匹配到的列添加列名,(?P<col_name>regex)

In [17]: s = pd.Series(['a1', 'b2', 'c3'])

In [18]: type(s.str.extract('[ab](\d)', expand=True))
Out[18]: pandas.core.frame.DataFrame

In [19]: type(s.str.extract('[ab](\d)', expand=False))
Out[19]: pandas.core.series.Series

In [21]: s.str.extract('[ab](\d)', expand=True)
Out[21]:
     0
0    1
1    2
2  NaN
# '[ab](\d)' a或b[匹配但不提取] 接 \d任意数字(匹配且提取组) 

In [23]: s.str.extract('(?P<letter>[ab])(?P<digit>\d)', expand=True)
Out[23]:
  letter digit
0      a     1
1      b     2
2    NaN   NaN
# '(?P<letter>[ab])(?P<digit>\d)'第一组列名为letter,匹配a或b。
# 第二组列名为digit,匹配任意数字。

提取所有

提取所有匹配成功的字符串并返回,str.extractall(regex)

In [24]: s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"])

In [25]: two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'

In [26]: s.str.extract(two_groups, expand=True)
Out[26]:
  letter digit
A      a     1
B      b     1
C      c     1

In [27]: s.str.extractall(two_groups)
Out[27]:
        letter digit
  match
A 0          a     1
  1          a     2
B 0          b     1
C 0          c     1

str.match(regex) 和 str.contains(regex)

返回布尔型结果。

In [28]: pattern = r'[a-z][0-9]'

In [29]: pd.Series(['h1', '2s4', '3a', '3b', 'c03c']).str.contains(pattern)
Out[29]:
0     True
1     True
2    False
3    False
4     True
dtype: bool

In [30]: pd.Series(['h1', '2s4', '3a', '3b', 'c03c']).str.match(pattern)
Out[30]:
0     True
1    False
2    False
3    False
4     True
dtype: bool

match依据的是re.match,而contains依据的是re.search。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容