首页 > 解决方案 > 如何用名称腌制熊猫数据框

问题描述

我想pandas用名称腌制 DataFrame。但它似乎失败了,如下所示。

请告诉我如何用名称腌制 DataFrame。

熊猫版本:0.23.4

输入:

df = pd.DataFrame({'a':[0,1]})
df.name = 'test'
print(df.name)
with open('../data/intermediate/test.pickle', 'wb') as f:
    pickle.dump(df, f)

with open('../data/intermediate/test.pickle', 'rb') as f:
    test = pickle.load(f)
print(test.name)

输出:

test
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-22a78fcd97e8> in <module>()
      7 with open('../data/intermediate/test.pickle', 'rb') as f:
      8     test = pickle.load(f)
----> 9 print(test.name)

~\Anaconda3\lib\site-packages\pandas\core\generic.py in __getattr__(self, name)
   4374             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   4375                 return self[name]
-> 4376             return object.__getattribute__(self, name)
   4377 
   4378     def __setattr__(self, name, value):

AttributeError: 'DataFrame' object has no attribute 'name'

标签: pythonpandas

解决方案


pickle框架中,saveloadapi 是以下实现:

def save(obj):
    return (obj.__class__, obj.__dict__)

def load(cls, attributes):
    obj = cls.__new__(cls)
    obj.__dict__.update(attributes)
    return obj

__dict__in 类没有DataFrame属性name,所以不会更新。

如果您想腌制您的自定义属性,您可以DataFrame使用name. 看起来像:

class AdvancedDataFrame(pd.DataFrame):

    def __init__(self, *args, **kwargs):
        self.name = kwargs.pop('name') if 'name' in kwargs else None
        super(AdvancedDataFrame, self).__init__(*args, **kwargs)

推荐阅读