原标题:左右用R右手Python9——字符串合并与拆分
杜雨,EasyCharts团队成员,R语言中文社区专栏作者,兴趣方向为:Excel商务图表,R语言数据可视化,地理信息数据可视化。个人公众号:数据小魔方(微信ID:datamofang) ,“数据小魔方”创始人。
在文本处理和数据清洗阶段,对字符串或者字符型变量进行分割、提取或者合并虽然谈不上什么高频需求,但是往往也对很重要的。
接下来跟大家大致盘点一下在R语言与Pyhton中,常用的字符串分割与合并的函数。
R语言:
字符串向量:
针对向量:
strsplit #针对字符串向量(拆分)
str_split #针对字符串向量(拆分)stringr包内函数
paste #针对向量合并
针对数据框:
unite #合并数据框中的某几列
separate #将数据框中某一列按照某种模式拆分成几列R语言:library(dplyr)
library(stringr)
library(tidyr) myyear
[ 1] "10""03""01""09""04""02""05""07""00""12"
[ 1] "18""15""28""00""11""20""31""19""04""12"
首先使用paste函数进行合并:
full
[1]"2000""""2002""""""""2001"""""""
使用strsplit函数进行拆分:
myyear1=mymonth1=myday1=NULLfor( i in 1:length(full)){myyear1[i]
str_split函数与strsplit函数用法类似:
myyear1=mymonth1=myday1= NULL
for( i in1:length(full)){myyear1[i] myyear1;mymonth1;myday1[ 1] "2000""""2002""""""""2001"""""""
[ 1] "10""03""01""09""04""02""05""07""00""12"
[ 1] "18""15""28""00""11""20""31""19""04""12"
接下来解释在如何直接针对数据框进行合并与分列的操作:
mydata
120001018
20315
32008
40900
50411
60220
720010531
80719
90004
101212unite (data,col, ..., sep = "-", remove = TRUE)separate(data,col, into,sep= "-", remove = TRUE)
unite和separate函数是配对函数,内部的参数严格白痴对称,第一个参数数要操作的数据框名称,第二个参数是合并后的新列名(或者待拆分的列名),第三部分是待合并的列名向量(拆分后的新增列名),sep是拆分(合并)依据,remove则控制输出的数据框是否包含原始向量(针对合并前的待合并变量和拆分前的待拆分变量)。
mydata1
datetime myyear mymonth myday
12000- 10- 1820001018
2- 03- 150315
32002- 01- 282008
4- 09- 000900
5- 04- 110411
6- 02- 200220
72001- 05- 3120010531
8- 07- 190719
9- 00- 040004
10- 12- 121212mydata2
12000- 10- 182000- 10- 1820001018
2- 03- 15- 03- 150315
32002- 01- 282002- 01- 282008
4- 09- 00- 09- 000900
5- 04- 11- 04- 110411
6- 02- 20- 02- 200220
72001- 05- 312001- 05- 3120010531
8- 07- 19- 07- 190719
9- 00- 04- 00- 040004
10- 12- 12- 12- 121212
Python字符串合并与分列:
因为对Python的字符串操作掌握有限,再加上Python字符串操作及其灵活,各种推导式和匿名函数可以很方便的完成,这里仅给出自己常用的做法作为实例,未包含所有方法:
字符串合并:
字符串链接符:”+”
字符串合并函数:join
字符串拆分:split
importrandom importpandas aspd myyear=random.sample(list(range( 2000, )), 10);myyearmymonth=[ '%02d'% i fori inrandom.sample(list(range( 1, 12)), 10)];mymonthmyday=[ '%02d'% i fori inrandom.sample(list(range( 1, 31)), 10)];myday[ , 2000, , 2001, , , 2002, , , ][ '04', '11', '06', '10', '07', '08', '05', '02', '03', '01'][ '13', '28', '21', '06', '08', '03', '17', '16', '04', '20']
字符串合并:
mydate=[str(i)+ "-"+j+ "-"+k fori,j,k inzip(myyear,mymonth,myday)][ '-04-25', '-11-30', '-06-02', '-10-22', '-07-13', '-08-27', '-05-28', '-02-10', '-03-14', '-01-21']mydate=[ "-".join([str(i),j,k]) fori,j,k inzip(myyear,mymonth,myday)][ '-04-25', '-11-30', '-06-02', '-10-22', '-07-13', '-08-27', '-05-28', '-02-10', '-03-14', '-01-21']
字符串拆分:
方法一(列表推导式):
myyear1=[i.split( "-")[ 0] fori inmydate];myyear1mymonth1=[i.split( "-")[ 1] fori inmydate];mymonth1myday1=[i.split( "-")[ 2] fori inmydate];myday1[ '', '', '', '', '', '', '', '', '', ''][ '04', '11', '06', '10', '07', '08', '05', '02', '03', '01'][ '25', '30', '02', '22', '13', '27', '28', '10', '14', '21']
方法二(使用字典):
mydata=pd.DataFrame({ "date":mydate})mydata[ "date"].str.split( "-",expand= True)
012
00425
11130
20602
31022
40713
50827
60528
70210
80314
90121myyear2=mydata[ "date"].str.split( "-",expand= True)[ 0];print(myyear2)mymonth2=mydata[ "date"].str.split( "-",expand= True)[ 1];print(mymonth2)myday2=mydata[ "date"].str.split( "-",expand= True)[ 2];print(myday2) 0123456789Name: 0, dtype: object 004111206310407508605702803901Name: 1, dtype: object 02513022413527628710814921Name: 2, dtype: object
本文小结——字符串拆分与合并:
R语言:
拆分:
strsplit
str_split
合并:
paste
tidyr::unite
tidyr::separate
Python:
拆分:
.split
合并:
“+”
join
R语言(ggplot2入门)可视化在商务场景中的应用,已经有200+小伙伴加入了!
责任编辑: