【问题标题】:Memoize a costly computation of a data frame记忆数据帧的昂贵计算
【发布时间】:2013-11-05 09:52:21
【问题描述】:

我有一个昂贵的计算,在 pandas DataFrames 上运行。我想把它记下来。我正在尝试弄清楚,我可以为此使用什么。

In [16]: id(pd.DataFrame({1: [1,2,3]}))
Out[16]: 52015696

In [17]: id(pd.DataFrame({1: [1,2,3]}))
Out[17]: 52015504

In [18]: id(pd.DataFrame({1: [1,2,3]}))
Out[18]: 52015504

In [19]: id(pd.DataFrame({1: [1,2,3]})) # different results, won't work for my case
Out[19]: 52015440

In [20]: hash(pd.DataFrame({1: [1,2,3]})) # throws
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-3bddc0b20163> in <module>()
----> 1 hash(pd.DataFrame({1: [1,2,3]}))

/usr/local/lib/python2.7/dist-packages/pandas/core/generic.pyc in __hash__(self)
     52     def __hash__(self):
     53         raise TypeError('{0!r} objects are mutable, thus they cannot be'
---> 54                               ' hashed'.format(self.__class__.__name__))
     55 
     56     def __unicode__(self):

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

鉴于我确定我不会改变被记忆的DataFrame,是否可以做我想做的事?

【问题讨论】:

    标签: python pandas memoization


    【解决方案1】:

    如果您不介意比较索引或列名,可以将 DataFrame 转换为元组:

    >>> df1 = pd.DataFrame({1: [1,2,3]})
    >>> df2 = pd.DataFrame({1: [1,2,3]})
    >>> hash(tuple(tuple(x) for x in df1.values)) == hash(tuple(tuple(x) for x in df2.values))
    True
    >>> id(df1) == id(df2)
    False
    

    你也可以使用 map 函数代替生成器:

    tuple(map(tuple, df1.values))
    

    如果您还需要比较索引,可以将其添加为列。您还可以通过创建命名元组来保留列名:

    >>> from collections import namedtuple
    >>> from pprint import pprint
    >>> df = pd.DataFrame({1: [1,2,3], 2:[3,4,5]})
    >>> df['index'] = df.index
    >>> df
       1  2  index
    0  1  3      0
    1  2  4      1
    2  3  5      2
    >>>
    >>> dfr = namedtuple('row', map(lambda x: 'col_' + str(x), df.columns))
    >>> res = tuple(map(lambda x: dfr(*x), df.values))
    >>> pprint(res)
    (row(col_1=1, col_2=3, col_index=0),
     row(col_1=2, col_2=4, col_index=1),
     row(col_1=3, col_2=5, col_index=2))
    

    希望对你有帮助。

    【讨论】:

    • 这很有帮助。谢谢!
    猜你喜欢
    • 2010-12-04
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多