как настроить фрейм данных pandas с именем

#python #pandas

#python #pandas

Вопрос:

Я хочу настроить pandas фрейм данных с именем. Но, похоже, это не удается, как я показываю ниже.

Пожалуйста, скажите мне, как настроить фрейм данных с именем.

версия pandas: 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)

~Anaconda3libsite-packagespandascoregeneric.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'
  

Ответ №1:

В pickle framework api save и load представляет собой следующую реализацию:

 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)
  

Комментарии:

1. Большое вам спасибо, и я узнал кое-что новое о python.

2. Могу ли я использовать это AdvancedDataFrame с pandas pd.read_pickle и .to_pickle ?