#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
с pandaspd.read_pickle
и.to_pickle
?