Python 数据处理(三十五)—— 文本数据处理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 数据处理(三十五)—— 文本数据处理相关的知识,希望对你有一定的参考价值。

参考技术A 在 pandas 中,存储文本主要有两种方式

但一般建议使用 StringDtype 类型存储文本数据。都是由于各种原因,现在字符串数据的默认存储类型还是 object 。

要存储为 string 类型,需要显式的设置 dtype 参数

或者在创建 Series 或 DataFrame 之后,使用 astype 转换类型

也可以使用 StringDtype/"string" 转换其他非字符串类型的数据

转换现有数据的类型

StringDtype 类型对象与 object 类型之间存在一些差异

两个结果的输出都是 Int64 类型。将其与 object 类型比较

当存在 NA 值时,输出为 float64 。类似地,对于返回布尔值的方法

Series 和 Index 有一套字符串处理方法,可以方便地对数组的每个元素进行操作,最重要的是,这些方法会自动忽略缺失值。

这些方法可以通过 str 属性访问,通常具有与内置字符串方法相匹配的名称

Index 上的字符串方法对于清理或转换 DataFrame 的列特别有用。

例如,您可能有带有前导或后置空格的列

因为 df.columns 是一个 Index 对象,所以我们可以使用 .str 访问器

我们可以根据需要对列名进行处理,然后重新设置列名。

例如,我们删除列名的前后空格,并将其改为小写字母,同时用 _ 替换剩余的空格

split 方法会返回一个值为 list 的 Series

可以使用 get 或 [] 访问拆分后的列表中的元素

更简单的方法是设置 expand 参数,返回一个 DataFrame

当原来的 Series 包含 StringDtype 类型的数据时,输出列也将全部为 StringDtype

当然,也可以设置切割次数

它还有个对应的 rsplit 方法,从右边起始对字符串进行拆分

replace 参数支持使用正则表达式,前两个参数是 pat (匹配模式) 和 repl (替换字符串)

如果只是想要替换字符串字面值,可以将 regex 参数设置为 False ,而不需要对每个特殊字符进行转义。此时 pat 和 repl 参数必须是字符串

此外, replace 方法还接受一个可调用的替换函数,会使用 re.sub() 方法在每个匹配的模式上调用该函数

该函数需要传入一个正则对象作为位置参数,并返回一个字符串。例如

replace 方法的 pat 参数还接受 re.compile() 编译的正则表达式对象。所有的 flags 需要在编译正则对象时设置

如果在 replace 中设置 flags 参数,则会抛出异常

有几种方法可以将一个 Series 或 Index 与自己或其他的 Series 或 Index 相连接,所有这些方法都是基于 cat() 方法

可以连接一个 Series 或 Index 的内容

如果未指定 sep 参数,则默认为空字符串

默认会跳过缺失值,也可以使用 na_rep 指定缺失值的表示方式

cat() 的第一个参数 others 可以是类似列表的对象,但是其长度需要和调用对象一致

只要两个对象中存在缺失值,对应的结果中也是缺失值,除非指定了 na_rep

others 参数也可以是二维的,但是得保证其行数必须与调用的对象一致

对于 Series 或 DataFrame 的连接,可以通过设置 join 参数指定对齐方式

通常 join 可选范围为: 'left' , 'outer' , 'inner' , 'right' 。此时,不再要求两个对象长度一致

当 others 参数是 DataFrame 时,也可以使用

可以将一些类似数组的对象(如 Series , Index 等)放在一个类似列表的容器中,然后传递给 cat

对于没有索引的对象,其长度必须与调用 cat 的对象相同。但是 Series 和 Index 可以是任意的,除非设置了 json=None 。

如果在 others 参数上包含不同索引的对象,且设置了 join='right' ,则最后的结果将会是这些索引的并集

Python机器学习(三十五)NumPy ndarray

NumPy中最重要的类是ndarray,ndarray是存储单一数据类型的多维数组。

可以使用索引(从0开始)访问ndarray对象中的元素。

ndarray的内存结构

标准的Python列表(list)中,元素是对象。如:L = [1, 2, 3],需要3个指针和三个整数对象,对于数值运算比较浪费资源。

与此不同,ndarray中元素直接存储为原始数据,元素的类型由ndarray对象中的属性dtype描述。

当ndarray数组中的元素,通过索引或切片返回时,会根据dtype,从原始数据转换成Python对象,以便外部使用。

技术图片

上图中,ndarray头部信息中的dtype描述了数组元素的数据类型,元素保存为原始数据(二进制数据),从数组中取出后,将根据dtype转换为相应的python对象。

创建Ndarray对象

要创建ndarray对象,可以使用numpy模块中的array构造函数。为此,首先需要导入numpy模块。

>>> a = numpy.array  

示例

[root@qikegu py3]# python
Python 3.7.3 (default, Jun 17 2019, 22:07:41)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> a = numpy.array
>>> print(a)
<built-in function array>

可以将集合对象传递给array函数,用于创建与集合对象内容相同的n维数组。语法如下所示:

>>> numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)  

下表是参数说明:

序号参数描述
1 object 表示集合对象,可以是列表、元组、字典、集合等等。
2 dtype 可选。可以通过此项参数更改数组元素的类型,默认值是none,表示保持原集合对象中的类型。
3 copy 可选参数。默认是true,表明复制对象。
4 order {‘K’, ‘A’, ‘C’, ‘F’}, 可选参数。指定数组的内存布局,可以是C语言顺序(行)或Fortan语言顺序(列)。详情可参考官方文档。

 

5 subok 布尔量,可选参数。默认false,表示须返回基类数组;如果设置为true,表示可以返回子类。
6 ndmin 整型,可选。指定返回数组的最小维数。

要使用Python列表创建ndarray数组,使用以下语句:

a = numpy.array([1, 2, 3])  

示例

>>> a = numpy.array([1,2,3])
>>> print(a)
[1 2 3]

要创建多维数组,可使用以下语句。

a = numpy.array([[1, 2, 3], [4, 5, 6]]) 

示例

>>> a = numpy.array([[1, 2, 3], [4, 5, 6]])
>>> print(a)
[[1 2 3]
 [4 5 6]]

要指定数组元素的数据类型,可以传入dtype参数。

a = numpy.array([1, 3, 5, 7], complex)  

示例

指定数组元素为复数类型:

>>> a = numpy.array([1, 3, 5, 7], complex)
>>> print(a)
[1.+0.j 3.+0.j 5.+0.j 7.+0.j]

获取数组的维数

ndarray.ndim属性可以用来获取数组的维数。

示例

>>> arr = numpy.array([[1, 2, 3, 4], [4, 5, 6, 7], [9, 10, 11, 23]])
>>> print(arr.ndim)
2 

获取数组元素的大小

ndarray.itemsize属性用于获取数组元素的大小,该函数返回数组元素的字节数。

示例

#获取数组元素的大小  
import numpy as np  
a = np.array([[1,2,3]])  
print("数组元素大小:", a.itemsize, "字节")  

输出

数组元素大小: 8 字节

获取数组元素的数据类型

要检查数组元素的数据类型,可以使用ndarray.dtype属性。

示例

#检查数组元素的数据类型
import numpy as np  
a = np.array([[1,2,3]])  
print("数据元素的数据类型是:", a.dtype)  

输出

数据元素的数据类型是: int64

获取数组的形状和大小

要获得数组的形状和大小,可以使用ndarray.sizendarray.shape属性。

数组形状是指数组的行数和列数,如一个二维数组的形状是:2(行)x 3(列)

示例

import numpy as np  
a = np.array([[1,2,3,4,5,6,7]])  
print("大小:",a.size)  
print("形状:",a.shape)  

输出

大小: 7
形状: (1, 7)

重构数组对象

数组的形状指的是多维数组的行数和列数。numpy中,可以改变数组的形状,即数组的行列排布。

ndarray.reshape()函数可用于重构数组。该函数接受新形状的行、列两个参数。

例如,如下图所示,可以把3×2的数组改为2×3的数组。

技术图片

示例

import numpy as np  
a = np.array([[1,2],[3,4],[5,6]])  
print("原数组:")  
print(a)  
a=a.reshape(2,3)  
print("改变后:")  
print(a)

输出

原数组:
[[1 2]
 [3 4]
 [5 6]]

改变后:
[[1 2 3]
 [4 5 6]]

数组切片

NumPy中,数组切片可以从数组中提取指定范围的数组元素。NumPy中的数组切片方法与python中的列表切片方法类似。

切片语法

arr_name[start: end: step]
  • [:]表示复制源列表
  • 负的index表示,从后往前。-1表示最后一个元素。
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> print(a[:5])
[1 2 3 4 5]
>>> print(a[1:5:2])
[2 4]

关于数组切片,后续章节将有详细介绍。

linspace

linspace()函数的作用是: 返回给定区间内均匀分布的值。下面的示例,在给定的区间5-15内返回10个均匀分布的值

示例

import numpy as np  
a=np.linspace(5,15,10) #打印10个值,这些值在给定的区间5-15上均匀地分布
print(a)  

输出

[ 5.          6.11111111  7.22222222  8.33333333  9.44444444 10.55555556
 11.66666667 12.77777778 13.88888889 15.        ]

获取数组元素中的最大值、最小值以及元素的和

ndarray.max()ndarray.min()ndarray.sum()函数,分别用于获取数组元素中的最大值、最小值以及元素和。

示例

import numpy as np  
a = np.array([1,2,3,10,15,4])  
print("数组:",a)  
print("最大值:",a.max())  
print("最小值:",a.min())  
print("元素总和:",a.sum())   

输出

数组: [ 1  2  3 10 15  4]
最大值: 15
最小值: 1
元素总和: 35

NumPy数组轴

NumPy多维数组由轴表示,其中axis-0表示列,axis-1表示行。我们可以通过轴对列或行进行计算。例如,求某行元素的和。

技术图片

示例

计算每一列中的最大元素、每一行中的最小元素,以及每一行的和:

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
print("数组:",a)  
print("每列的最大元素:",a.max(axis = 0))   
print("每行的最小元素:",a.min(axis = 1))  
print("每行的和:",a.sum(axis = 1))  

输出

数组: [[ 1  2 30]
 [10 15  4]]
每列的最大元素: [10 15 30]
每行的最小元素: [1 4]
每行的和: [33 29]

求平方根和标准差

NumPy中,sqrt()std()函数分别求数组元素的平方根和标准差。

标准差表示数组的每个元素与numpy数组的平均值之间的差异。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
print(np.sqrt(a))  
print(np.std(a)) 

输出

[[1.         1.41421356 5.47722558]
 [3.16227766 3.87298335 2.        ]]
10.044346115546242

数组间的算术运算

numpy中,多维数组间可以直接进行算术运算。

在下面的示例中,对两个多维数组a和b执行算术运算。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
b = np.array([[1,2,3],[12, 19, 29]])  
print("a+b
",a+b)  
print("axb
",a*b)  
print("a/b
",a/b)  

输出

a+b
 [[ 2  4 33]
 [22 34 33]]
axb
 [[  1   4  90]
 [120 285 116]]
a/b
 [[ 1.          1.         10.        ]
 [ 0.83333333  0.78947368  0.13793103]]

数组拼接

numpy中,可以垂直或水平拼接2个数组。

示例

import numpy as np  
a = np.array([[1,2,30],[10,15,4]])  
b = np.array([[1,2,3],[12, 19, 29]])  
print("垂直拼接
",np.vstack((a,b)));  
print("水平拼接
",np.hstack((a,b)))  

输出

垂直拼接
 [[ 1  2 30]
 [10 15  4]
 [ 1  2  3]
 [12 19 29]]
水平拼接
 [[ 1  2 30  1  2  3]
 [10 15  4 12 19 29]]

 

以上是关于Python 数据处理(三十五)—— 文本数据处理的主要内容,如果未能解决你的问题,请参考以下文章

三十五:python中的异常

三十五:python中的异常

我的第三十五篇博客---flask-wtf表单验证

Python学习日记(三十五) Mysql数据库篇 三

Python机器学习(三十五)NumPy ndarray

Python学习笔记(三十五)struct