23、pandas的多列拼接成一列函数.str.cat()

23、pandas的多列拼接成一列函数.str.cat(),第1张

在数据处理时,常常需要将某一列进行拆分,分列,这个在之前的文章中已经总结过了,有str.split()、str.extract()、str.replace函数

不过有时候我们不仅仅需要将数据进行拆分,也还需要进行拼接 *** 作。将不要的拆掉,再将需要的拼接上。这个 *** 作在str.replace没法达到预期结果的时候就显得很重要了。

接下来我们就来看看这个函数到底特别在哪个地方:

一、字符串列的合并

如果我们要将location和location_road两列拼接起来,我们可以这么 *** 作:

也就是第一列的名称.str.cat(第二列的名称)。

当然这样处理是不方便我们后续继续 *** 作的,假如我们后续要将合并的这一列拆分开就会比较麻烦了。

所以我们可以在两个合并的列中间加一个分隔符号:

增加参数sep=''就是增加分隔符号,具体的符号可自定义。

二、含有数值列的合并

str.cat()函数使用的前提是两列的内容都是字符串,如果是数值型的话会报错。

这个时候就需要先对整数型的列先做一下转换:

数据类型的转换也可以用:

三、在某列加上某一特定的字符串

如果只是想在某一列上的所以字符串都加上一个相同的字符串要怎么 *** 作呢?

我们先直接在cat()函数当中直接加上我们想要的字符串试试看:

直接加字符串出现了报错:pandas把这样的 *** 作误认为了是sep分隔符号了,然后就出现错误了。

所以我们得先建一列:

然后就可以使用cat()函数进行拼接:

这样就可以把多列进行拼接了,需要注意的是多列拼接的时候需要用中括号把多列括起来。

当然了,以上的这些 *** 作也可以使用自定义函数来完成。

上次留了一个小问题,不知道大家想清楚了没有?

其实 np.apply_along_axis 实现的也是轴上的 *** 作,对轴上的值统一用函数进行处理,然后返回值。

out:

在这一步中,处理的是第一个轴,第一个轴有1个值,剩下的还有一个轴,维度为2,所以处理了两次。

应该记住,每次指定的 axis 都是可能要发生改变的轴,指定的轴有1个值,所以送入函数的有1个值,剩下的维度就是送入的次数。

所以函数每次拿到的是长度为1的一个 list , print 一下也可以看出来。

out:

用下面的例子会看的更容易些。

out:

处理的是第二个轴,每次送入三个值,剩下的维度为2X4,所以送入8次,这8次的每三个值都是依次遍历第一层1,2和最后一层1,2,3,4提取组成的。最后再组成一个2X4的ndarray。

out:

回到之前。

out:

axis=1 时,显然送入函数的就是一个长度为2的 list ,送入了一次。

那么问题就出在处理的次数上。

在 axis=0 的时候,两个字符串是分两次处理的,在第一次返回 ['hello'] 的时候,因为函数只返回一个值,所以numpy从中提取 'hello' 并由此获知返回的数据类型为 <U5 , <是小端存储的意思, U 表明该字符串为 unicode 字符, 5 表明长度为 5 ,而我们知道numpy中所有的数据类型都是一致的。所以当第二次返回 ['sssimon'] 的时候,numpy也拿到了 'sssimon' 并存储了,但是由于numpy在输出的时候是根据数据类型进行输出的,类型为 <U5 ,所以只输出了5个字符。

而 axis=1 的时候,返回的是列表 ['hello', 'sssimon'] ,numpy自动根据列表里最长的字符串进行类型推断,为 <U7 ,也就不会出现输出时的截断 *** 作。 这就是造成两者差异的原因,其实从给出的 dtype 中也可以看出来一些线索。

pandas和numpy中都有字符串处理的模块,pandas在 pd.Series.str 模块里,而numpy在 np.char 模块里。

pd.Series.str 是直接可以用切片 *** 作的。

out:

str 模块实现了例如 endswith , startswith , len , strip 等基础字符串的常用函数。

当然我比较常用的就是 replace ,里面还可以用正则表达式。

out:

我们可以用内置的 split 完成类似之前的拆分。

out:

拆分后返回的是 list ,dtype为object,我们可以借用 str 的切片 *** 作来提取一下第一个值。

out:

成功了!

当然其实用 apply 函数更简单直观一点。

out:

pandas中字符串处理只在series中可用,而numpy没有这个限制,因为numpy内部存储的全都是同一种类型。

np.char 模块也实现了常用的 lower , strip , replace , decode , encode , add 等函数,其本质上都是对单元素或者多元素调用函数,函数比较少,感觉不如pandas中的字符串处理灵活性大。

字符串处理在数据分析中常用于数据清洗过程,例如在分析转专业数据时,我拿到的pdf识别后的excel并没有那么整洁,会出现下面这种情况。

这种情况看似比较棘手,但是用正则就很容易。

你,学会了吗?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11898794.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存