pandas数据类型(二)与numpy的str和object类型之间的区别
现象:
Numpy区分了str和object类型,其中dtype(‘S’)和dtype(‘O’)分别对应于str和object.
然而,pandas缺乏这种区别 str和object类型都对应dtype(‘O’)类型,即使强制类型为dtype(‘S’)也无济于事
>>> import pandas as pd
>>> import numpy as np
>>>
>>>
>>> np.dtype(str)
dtype('S')
>>> np.dtype(object)
>>>
>>>
dtype('O')
>>> df = pd.DataFrame({'a': np.arange(5)})
>>> df
a
0 0
1 1
2 2
3 3
4 4
>>> df.a.dtype
dtype('int64')
>>> df.a.astype(str).dtype
dtype('O')
>>> df.a.astype(object).dtype
dtype('O')
>>> df.a.astype(str).dtype
dtype('O')
原理:
先说结论:
Numpy的字符串dtypes不是python字符串.pandas使用python字符串,.
numpy与pandas的字符串不同的含义:
>>> x = np.array(['Testing', 'a', 'string'], dtype='|S7')
>>> x
array([b'Testing', b'a', b'string'], dtype='|S7')
>>>
>>>
>>> y = np.array(['Testing', 'a', 'string'], dtype=object)
>>> y
array(['Testing', 'a', 'string'], dtype=object)
现在,一个是numpy字符串dtype(固定宽度,类似c的字符串),另一个原生python字符串数组.
如果我们试图超过7个字符,我们会看到立即的差异.numpy字符串dtype版本将被截断,而numpy对象dtype版本可以是任意长度
>>> x[1] = 'a really really really long'
>>> x
array([b'Testing', b'a reall', b'string'], dtype='|S7')
>>>
>>> y[1] = 'a really really really long'
>>> y
array(['Testing', 'a really really really long', 'string'], dtype=object)
尽管存在unicode固定长度字符串dtype,但| s dtype字符串不能正确地保持unicode
最后,numpy的字符串实际上是可变的,而Python字符串则不是.
>>> z = x.view(np.uint8)
>>> z
array([ 84, 101, 115, 116, 105, 110, 103, 97, 32, 114, 101, 97, 108,
108, 115, 116, 114, 105, 110, 103, 0], dtype=uint8)
>>> z+=1
>>> x
array([b'Uftujoh', b'b!sfbmm', b'tusjoh\x01'], dtype='|S7')
由于所有这些原因,pandas选择不允许类似C的固定长度字符串作为数据类型.
正如所注意到的那样,尝试将python字符串强制转换为固定的numpy字符串将无法在pandas中使用.相反,它总是使用本机python字符串,对大多数用户来说,它的行为更直观.
那为什么np.view可以验证
NumPy文档里对ndarray.view方法的说明:
ndarray.view(dtype=None, type=None)
New view of array with the same data。
返回数据的新视图。
除了view()方法,还有我们熟悉的reshape()方法也可以返回一个视图,至于其他方法也可以返回视图
import numpy as np
a = np.arange(10) b = a.reshape(5,2) c = a.view()
c.shape = (2,5) a_base = a.base
b_base = b.base
c_base = c.base
a_base, b_base, c_base
(None,
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))
对程序的说明,
首先创建一个具有10个数据的1维数组a,shape为(10, )。
b是reshape方法返回的a的一个视图(view),此时b是一个2维数组,它的shape为(5,2)。
c是view方法返回的a的一个视图,此时c的shape为(10, ),当执行c.shape = (2, 5)后c的shape变为(2, 5)。
b_base和c_base说明b和c只是a的一个视图,共享a的数据,虽然它们的shape各不相同。
接着我们来看看各个数组的base,
>>>a.base is None
True
>>>b.base is a
True
>>>c.base is a
True
如果一个数组的base是None,说明这个数组的数据是自己的,它是这个数据的所有者;如果不是None,则说明数据在不是自己的,他只能通过数据拥有者才能访问。
如果两个数组的base相同,说明它们指向同一个数据拥有者。
ndarray.base
NumPy文档说明: Base object if memory is from some other object.
base对象说明数据是否来自别的对象。
上面这个例子,a.base是None,说明a自己拥有数据,不是来自别人的,而b和c的base都是a,说明它们都没有自己的数据,都是a的。
下面代码的运行结果表明,这三个数组中只有a是数据的所有者,而b和c都不是。
a.flags.owndata, b.flags.owndata, c.flags.owndata
结果:(True, False, False)
验证:
b[1,1] = 88
把原来的3改成了88。结果我们看下图,三个数组里的3同时被改成88。
pandas数据类型(二)与numpy的str和object类型之间的区别的更多相关文章
- Python str 与 bytes 类型 之间的转换
bytes:字节数组,通常用它可以描述 “一个字符串”,只不过该字符串是 “bytes类型”,所以容易与str类型混淆,他们二者之间的转换: https://blog.csdn.net/lanchu ...
- [Pandas] 02 - Tutorial of NumPy
Ref: NumPy 教程 这里主要是查缺补漏一些常用方法. 初步认识 矩阵常见知识点 矩阵操作 Ref: [Python] 01 - Number and Matrix[总结过一部分] 一.矩阵 ( ...
- pandas、matplotlib、Numpy模块的简单学习
目录 一.pandas模块 二.matplotlib模块 1.条形图 2. 直方图 3.折线图 4.散点图+直线图 三.numpy 一.pandas模块 pandas是BSD许可的开源库,为Pytho ...
- python基础----数据类型二
数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...
- 02 Python学习笔记-基本数据类型(二)
一.基本知识 1.缩进: 2.一行多条语句: 3.断行: 4.注释 # 单行注释 '''这是一段 多行注释''' 5. 变量 1. 变量类型(局部变量.全局变量.系统变量) 2. 变量赋值 多重赋值x ...
- pandas 数据类型研究(一)数据转换
当利用pandas进行数据处理的时候,经常会遇到数据类型的问题,当拿到数据的时候,首先需要确定拿到的是正确类型的数据,一般通过数据类型的转化,这篇文章就介绍pandas里面的数据类型(data typ ...
- pandas字符串与时间序列的处理 str 与 dt
一.str属性 pandas里的Series有一个str属性,通个这个属性可以调用一些对字符串处理的通用函数, 如:df['road'].str.contains('康庄大道') 会返回字符串里包含 ...
- Python学习—基础篇之基本数据类型(二)
Python中重要的数据结构 1.列表 2.元组 3.字典 4.集合 列表 1.创建列表 # 方式一 name = [] print(type(name)) # 执行结果 >>> & ...
- 数据类型int、float、str、list、dict、set定义及常用方法汇总
数据类型int:记录整数事物状态 可变不可变:值不可变类型,改变变量值实则是改变了变量的指向 int():功能:1.工厂函数, i = 5 <==> i = int(5) 2.强制类型转换 ...
随机推荐
- Prometheus入门到放弃(3)之Grafana展示监控数据
grafana我们这里采用docker方式部署 1.下载镜像 镜像官网地址:https://hub.docker.com/r/grafana/grafana/tags [root@prometheus ...
- Java开发笔记(一百一十)GET方式的HTTP调用
所谓术业有专攻,一个程序单靠自身难以吃成大胖子,要想让程序变得血肉丰满,势必令其与外界多加交流,汲取天地之精华,方能练就盖世功夫.那么程序应当如何与外部网络进行通信呢?计算机网络的通信标准主要采取TC ...
- DjangoRestFramework学习二之序列化组件、视图组件
本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组件 首先按照restful规范咱们创建一些api接口,按照下面这些形式写吧: ...
- SpringCloud之熔断器Hystrix及服务监控Dashboard
目的: 服务雪崩效应 服务熔断服务降级 Hystrix默认超时时间设置 Hystrix服务监控Dashboard 服务雪崩效应 雪崩效应就是一种不稳定的平衡状态也是加密算法的一种特征,它指明文 ...
- 一行代码让3D翻转后的文本恢复清晰
FlashPlayer10提供的3D功能有一个相当蛋疼的问题:只要设置过rotationX.rotationY或者rotationZ属性,显示对象里面的文字(尤其是设备字体,位图文本)就会一直处于模糊 ...
- vue3 template refs dom的引用、组件的引用、获取子组件的值
介绍 通过 ref() 还可以引用页面上的元素或组件. DOM 的引用 <template> <div> <h3 ref="h3Ref">Tem ...
- asBroadcastStream
StreamSubscription sc = StreamSubscription(); Stream s = Stream(); sc.addStream(s); var bs = sc.stre ...
- Jmeter学习笔记(九)——响应断言
Jmeter中又一个元件叫断言,用于检查测试中得到的响应数据等是否符合预期.断言又13种,目前在使用过程中使用到的是响应断言. 有时候请求成功了并不代表测试通过,还要看影响返回的内容是否符合预期的结果 ...
- JDK的安装(mac)
1.第一步安装brew 教学网址 2.用brew安装jdk. brew update brew cask install java(未翻墙时长很长,大概猴年马月两个小时) 安装完成后就可以执行JAVA ...
- [LeetCode] 448. 找到所有数组中消失的数字 ☆
描述 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次. 找到所有在 [1, n] 范围之间没有出现在数组中的数字. 您 ...