Python-Pandas学习之HDFStore存储数据警告(your performance may suffer as PyTables will pickle....)_pd.hdfstore_苏小败在路上的博客-程序员秘密

技术标签: HDFStore  Pandas  Python学习记录  读写数据  Python  

这是一个类似数据表字典的格式,可以将很多的数据帧(dataframe)保存在一个对象里面。

每一个数据帧,都标有一个key,然后通过key来访问数据帧的数据。

但是,在使用HDF的时候,如果不指定格式,那么我们数据中存在string类型的数据,就会报以下警告:

PerformanceWarning: 
your performance may suffer as PyTables will pickle object types that it cannot
map directly to c-types [inferred_type->mixed,key->block3_values] [items->['user_id', 'version', 'country']]

我的这几列都是string类型的,虽然是警告,也能存进去,但是如果要读取出来就会报错:

Traceback (most recent call last):
  File "/Users/guojicheng/Desktop/Python/3/Projects/CsvToDatabase4/maintest-hdf.py", line 28, in <module>
    df = hstore.get('eos_20190612')
  File "/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 695, in get
    return self._read_group(group)
  File "/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 1423, in _read_group
    return s.read(**kwargs)
  File "/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 2995, in read
    start=_start, stop=_stop)
  File "/anaconda3/lib/python3.7/site-packages/pandas/io/pytables.py", line 2540, in read_array
    ret = node[0][start:stop]
  File "/anaconda3/lib/python3.7/site-packages/tables/vlarray.py", line 681, in __getitem__
    return self.read(start, stop, step)[0]
  File "/anaconda3/lib/python3.7/site-packages/tables/vlarray.py", line 821, in read
    listarr = self._read_array(start, stop, step)
  File "tables/hdf5extension.pyx", line 2155, in tables.hdf5extension.VLArray._read_array
ValueError: cannot set WRITEABLE flag to True of this array
Closing remaining open files:eos_data.h5...done

这个其实就是因为之前的警告引起的,那为什么string类型就不行呢?

因为我们的数据,默认都是unicode编码格式,而这个hdf对unicode的支持并不好,因此,如果有字符串的列,我们需要去转换一次:


df['user_id'] = df['user_id'].str.decode('utf-8')
df['version'] = df['version'].str.decode('utf-8')
df['country'] = df['country'].str.decode('utf-8')

这么转了之后,就不会出现警告了。但是当我读取出来的时候数据都变成了 float64,还需要转成int,在转化成string,也就是encode,很是麻烦。

下面还有一个方式,我们在存入数据的时候,指定下一存储格式,这种方式不需要做转换就可以:

hstore = pd.HDFStore('eos_data.h5', mode='w')
df = pd.read_csv(
    'testdata.csv', 
)
print(df.dtypes)
hstore.put('eos_20190612', df, format='table', append=False) # 指定了 format 为 table
hstore.close()

上面我指定格式为 table,这也没有警告。下面我们在读取出来看看,数据的类型有没有变:

hstore = pd.HDFStore('eos_data.h5', mode='r')
df = hstore.get('eos_20190612')
print(df.dtypes)
hstore.close()

看到结果是:


user_id                               object
version                               object
country                               object
dtype: object

所以需要只需要设置 format = ‘table’ 就可以了~

 

2019.8.12日补充:

最近我把pandas升级到最新的之后,也可以使用fixed模式了。但是fixed模式只是和读取和存储,不能做查询之类的操作,而且也不能使用append。这也是由于的写入的格式的二进制的,没法直接操作。所以fixed的模式,读写速度超级快,差不多是table的四到五倍,数据越大越多速度差异越明显~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pz789as/article/details/96881284

智能推荐

HIVE的参数配置、行转列 列转行 json相关 窗口函数_hive 行转json_烟解愁、酒上头的博客-程序员秘密

1、Hive的参数配置./hive 是hive的第一代客户端,次客户端,主要有两大作用 用于执行一些交互式或者批处理的操作,第二大作用,是用于启动hive的各项服务第一大作用:交互式(了解)./hive 进入交互式 进入之后,可以在客户端内部,不断和hive进行相关操作,在一个会话中,可以不断和hive进行交互批处理 批处理: 指的在不进入hive的交互窗口下, 即可操作hive, 主要是linux的命令行下操作 好处: 主要的目的是为了后续在linux的脚本中连接hive进行

win32diskimager 谨慎使用_weixin_33916256的博客-程序员秘密

  之前一个U盘用这个软件烧录Ubuntu镜像后,再烧录Centos发现 Centos安装时U盘启动不起来,然后U盘的大小也变了。感觉Win32diskimager对U盘的引导还是什么的破坏的厉害。网上有网友说使用USBOOT或USBImage可以重置化被Win32diskimager处理过的U盘,可以解决这个问题。转载于:https://www.cnblogs.com/yishuad/p/...

Xshell或Linux终端后台运行程序方法_xshell阻塞_踏雪_尋梅的博客-程序员秘密

Linux终端或者Xshell运行程序时,实时输出会占用资源。Xshell中长时间运行程序还可能会造成程序崩溃。此时需要后台启动程序,具体做法是在启动程序指令后面加&quot;&amp;amp;&quot;。如:./mytask&amp;amp;...

ubuntu设置双网卡以及多网段_ubuntu双网口上网设置_浩瀚蓝天dep的博客-程序员秘密

ubuntu设置双网卡以及实现多个网段设备之间可以互相访问

自然语言处理(NLP)相关资料汇总_自然语言处理汇总_LeeTioN的博客-程序员秘密

自然语言处理怎么最快入门? - 刘知远的回答 - 知乎 https://www.zhihu.com/question/19895141/answer/24710071 刘老师主要是从ACL等著名NLP相关会议的角度来介绍如何跟进NLP领域的研究...

su root 报错:linux新装系统无法进入root账户_linux 无法进入root_厚德载物cet的博客-程序员秘密

新手在学习ubuntu时,在终端下用su命令切换到root用户时会有 Authentication failure( 认证失败)的提示,根本原因是root用户没有被创建。首先用快捷键crtl+alt+T 打开终端,显示的是用户名@电脑名:~,符号,符号,符号就表示现在处于普通用户权限。然后输入:sudo passwd root终端会显示: Enter new UNIX passwor...

随便推点

Android读取系统联系人-内容提供器的使用_王权霸业的高杆左塞的博客-程序员秘密

Android中如何读取系统联系人?借助内容提供器!安卓四大组件之一的内容提供器,是我学习安卓的噩梦,我觉得这是安卓初期最为困难的一步一个程序可以通过内容提供器,提供给其他程序访问自身内容的接口,那么任何程序就可以通过接口来获取我们提供的内容。..自己的内容可以提供给别的程序,那别的程序一定也可以提供内容给我们。..诸如系统本身的电话簿,短信,媒体库,就提供了相应的接口供我们读取内容。可见内容提供器的重要,如果现在市面上所有的APP不能读取短信,电话簿等,相信功能一定会大打折扣的!

oracle em配置_ai_33的博客-程序员秘密

http://blog.csdn.net/managergh/archive/2007/11/19/1892768.aspx这是昊空间的文字!

GetLastError() 与查询工具_barryCG的博客-程序员秘密

今天帮同学调试一个win32程序。这个程序编译通过也可以执行,但是却出现不了窗口。好久没有没有去看win32的东西。花了好一会的时间,才找出了CreateWindows()的返回值一直是NULL的问题,查了一会资料,刚开始以为是 CreateWindow()函数会调用wndclass.lpfnWndProc对应的那个消息响应函数那部分。需要那个函数返回为TRUE。 但是改了很久却任然没有改观。

python 图像识别人体_【python】图像识别之人脸识别_weixin_39862794的博客-程序员秘密

1.安装opencv:pip install opencv-python2.代码def face_detect_demo(self):#读取image = cv2.imread('E://pythonprogram//data//image3.jpg')face_cascade = cv2.CascadeClassifier(r'E://pythonprogram//data//haarcasca...

程序员一生_weixin_34195142的博客-程序员秘密

35岁 你因为身体越来越差加班越来越少晋升的速度也越来越缓慢那天下班,媳妇告诉你孩子要上幼儿园了双语的一个月3000你皱了皱眉头,那边就已经不耐烦了“四单元的老王家孩子,一个月6000”“你已经这样了,你想让孩子也输?”你没说话,回屋给媳妇转了6000块钱这笔钱,你原本打算给自己过个生日,买个新电脑38岁,孩子上了一年级老师说一年级最关键,打好基础很...

推荐文章

热门文章

相关标签