【问题标题】:Values missing when loaded from Pandas HDF5 file从 Pandas HDF5 文件加载时缺少值
【发布时间】:2015-12-09 18:29:24
【问题描述】:

我在 Pandas 系列中加载了一些 Twitter 提要,我想以 HDF5 格式存储。这是它的一个示例:

    >>> feeds[80:90]

    80    BØR MAN STARTE en tweet med store bokstaver? F...
    81    @NRKSigrid @audunlysbakken Har du husket Per S...
    82    Lurer på om IS har fått med seg kaoset ved Eur...
    83    synes han hørte på P3 at Opoku uttales Opoko. ...
    84    De statsbærende partiene Ap og Høyre må ta sky...
    85    April 2014. Blir MDG det nye arbeider @partiet...
    86                       MDG: Hasj for kjøtt. #valg2015
    87               Grønt skifte.. https://t.co/OuM8quaMz0
    88                    Kinderegg https://t.co/AsECmw2sV9
    89    MDG for honning, frukt og grønt. https://t.co/...
    Name: feeds, dtype: object

每当我尝试从保存的 HDF5 文件中加载上述数据时,都会丢失一些值并替换为 ''... 当我更改索引时,相同的值会重新出现。例如,在存储索引为84-85的行时:

    >>> store = pd.HDFStore('feed.hd5')
    >>> store.append('feed', feeds[84:86], min_itemsize=200, encoding='utf-8')
    >>> store.close()

当我读取文件时,84th 行的值现在丢失了:

    >>> pd.read_hdf('feed.hd5', 'feed')

    84                                                     
    85    April 2014. Blir MDG det nye arbeider @partiet...
    Name: feeds, dtype: object

如果我也这样做,我会得到与上面相同的输出:

    >>> feeds[84:86].to_hdf('feed.hd5', 'feed', format='table', data_columns=True)
    >>> pd.read_hdf('feed.hd5', 'feed')

但如果我将索引从[84:86] 更改为[84:87],则84th 行现在已加载。

    >>> feeds[84:87].to_hdf('feed.hd5', 'feed', format='table', data_columns=True)
    >>> res = pd.read_hdf('feed.hd5', 'feed')
    >>> res

    84    De statsbærende partiene Ap og Høyre må ta sky...
    85    April 2014. Blir MDG det nye arbeider @partiet...
    86                       MDG: Hasj for kjøtt. #valg2015
    Name: feeds, dtype: object

但是现在,与原始推文相比,加载的字符串缺少一些字符。这是84th 行值推文:

    >>> # Original tweet (Length: 140)
    >>> print (feeds[84])

    De statsbærende partiene Ap og Høyre må ta skylda for Miljøpartiets fremgang. Velgerne har sett at SV og V ikke vinner frem i miljøspørsmål.

    >>> # Loaded tweet (Length: 134)
    >>> print (res[84])

    De statsbærende partiene Ap og Høyre må ta skylda for Miljøpartiets fremgang. Velgerne har sett at SV og V ikke vinner frem i miljøspø

我计划主要使用 Python 3.3.x 来支持 PyTables 中的 unicode 列(我错了吗?),但还不能成功存储所有数据。谁能解释一下,让我知道如何避免它?

我正在使用OS: Mac OS X Yosemite, Pandas: 0.16.2, Python: 3.3.5, PyTables: 3.2.0

更新:我通过 HDFView (http://www.hdfgroup.org/products/java/hdfview/) 确认数据确实总是被存储(尽管缺少一些最后的字符),但我每次都无法成功加载它。

谢谢。

【问题讨论】:

    标签: python python-3.x pandas hdf5 pytables


    【解决方案1】:

    我已经找到了问题并且可以部分纠正它。如果某人首先发布了一条接近 140 个字符的推文,而另一个人转发了该推文,则后者不包含完整的推文,因为转发推文会预先附加一些文本,例如 RT @username:。结果,这条推文现在超过 140 个字符,因此被精简到 140 个,并且是通过用于 python 的 Twitter API 获得的,例如 tweepyPython twitter tools(这是我测试过的两个......)。有时这类推文的最后一个字符是字符'…',其长度为1,序数值为8230(在python 3.x 或@中尝试chr(8230) 987654328@ 对于 python 2.x...)。当这些存储在 HDF5 文件中并通过 pd.read_hdf 读取时,它无法完成,而是 pandas 用 '' 替换了整个推文。

    这可以纠正如下:

    >>> # replace that '…' character with '' (empty char)
    >>> ch = chr(8230)
    >>> feeds.str.replace(ch, '')
    
    >>> # Store it in HDF5 now... # Not sure if it preserves the encoding...
    >>> feeds.to_hdf('feed.h5', 'feed', format='table', append=True, encoding='utf-8', data_columns=True)
    
    >>> # If you prefer this way
    >>> with pd.HDFStore('feed.h5') as store:
            store.append('feed', feeds, min_itemsize=200, encoding='utf-8')
    
    >>> # Now read it safely
    >>> pd.read_hdf('feed.h5', 'feed')
    

    但是,如果有一些 unicode 字符,有时问题仍然会出现......提供encoding='utf-8' 选项并没有真正帮助,至少对我来说是这样。感谢您在这方面的任何帮助... :)

    【讨论】:

      【解决方案2】:

      查看文档字符串here

      您需要提供encoding='utf-8' 否则这将使用您的默认python 编码存储(可能有效也可能无效)。读取将使用写入的编码。

      数据

      In [13]: df[84:86]
      Out[13]: 
                    tweet_id  username                 tweet_time                                              tweet
      84  641437756275720192  @nicecap  2015-09-09T02:27:33+00:00  De statsbærende partiene Ap og Høyre må ta sky...
      85  641434661391101952  @nicecap  2015-09-09T02:15:15+00:00  April 2014. Blir MDG det nye arbeider @partiet...
      

      追加,提供编码。

      In [11]: store.append('feed',df[84:86],encoding='utf-8')
      

      读取时也提供编码

      In [12]: store.select('feed',encoding='utf-8')
      Out[12]: 
                    tweet_id  username                 tweet_time                                              tweet
      84  641437756275720192  @nicecap  2015-09-09T02:27:33+00:00  De statsbærende partiene Ap og Høyre må ta sky...
      85  641434661391101952  @nicecap  2015-09-09T02:15:15+00:00  April 2014. Blir MDG det nye arbeider @partiet...
      

      这是它的存储方式

      In [14]: store.get_storer('feed')
      Out[14]: frame_table  (typ->appendable,nrows->2,ncols->4,indexers->[index])
      
      In [15]: store.get_storer('feed').attrs
      Out[15]: 
      /feed._v_attrs (AttributeSet), 15 attributes:
         [CLASS := 'GROUP',
          TITLE := '',
          VERSION := '1.0',
          data_columns := [],
          encoding := 'utf-8',
          index_cols := [(0, 'index')],
          info := {1: {'names': [None], 'type': 'Index'}, 'index': {}},
          levels := 1,
          metadata := [],
          nan_rep := 'nan',
          non_index_axes := [(1, ['tweet_id', 'username', 'tweet_time', 'tweet'])],
          pandas_type := 'frame_table',
          pandas_version := '0.15.2',
          table_type := 'appendable_frame',
          values_cols := ['values_block_0', 'values_block_1']]
      

      所以,我想这是一个错误,我应该在阅读时默认使用存储的编码。我创建了一个问题here

      【讨论】:

      • 感谢杰夫提及。我已经在帖子中对其进行了编辑。但它仍然没有帮助。我尝试通过上下文管理器(with HDFStore(...))read_hdf 阅读它。这些值仍然缺失。还有什么我想念的吗?
      • 但奇怪的是,如果我如上所述更改索引,它加载正常(但字符更少)。所以当我加载完整的文件时,很多行都有' ',但是虽然只检索少数索引,但它们加载得很好。我无法理解这一点。 :-/
      • 您能否发布一个示例文件(并使用read_csv 显示您的阅读方式),以获得完全相同的数据
      • 这里是:dropbox.com/s/kp9rzhcqsk373gw/feed_dump.csv?dl=0。我将 CSV 读取为data = pd.read_csv('feed_dump.csv', header=0, index=None, encoding='utf-8', engine='python'),仅将推文读取为feeds = data['tweet']
      • 嘿@jeff,我已经尝试了您的解决方案使用编码,但仍然无法加载84th 行...请问是否还有其他问题?我在这里附上了它的截图以及pd.show_versions( )dropbox.com/s/wh5kj0p6kpz3vto/Error_Pandas_HDF5.png?dl=0。你能看一下吗?
      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 2019-12-10
      • 2011-10-01
      相关资源
      最近更新 更多