在一些Pandas更新之后(现在使用v1.1.1),我在系列中存储DataFrame的代码已损坏。我正在使用一个类来管理包含标识信息和交易列表的不同帐户的DataFrame。以前,下面的代码可以正常工作,并将tr
和eod
DataFrame存储在帐户的每个相关行中。
class Accounts:
def __init__(self):
self.accs = pd.DataFrame(columns=['desc', 'type', 'mask', 'tr', 'eod'])
def append(self, account_name, account_description, account_type, filemask):
"""Add new account to Accounts class."""
self.accs = self.accs.append(pd.DataFrame(data=
{'desc': account_description,
'type': account_type,
'mask': filemask},
index=pd.Index([account_name])), sort=True)
def add_data(self, name, tr, eod):
"""Add data to an account in class.
Input:
name = Account name / id
tr = Transactions DataFrame
eod = End of day DataFrame
"""
self().loc[name]['tr'] = tr
self().loc[name]['eod'] = eod
def __call__(self, name=False):
if name:
return self.accs.loc[name]
else:
return self.accs
下面是我目前如何使用这些功能的示例。
accs = Accounts()
accs.append('name', 'desc', 'type', 'mask')
# tr and eod generated elsewhere but they are DataFrames
accs.add_data('name', tr, eod)
使用上面的类代码会给我带来A value is trying to be set on a copy of a slice from a DataFrame
错误,而accs
DataFrame中什么也没有存储。而且此方法以前一直有效,没有任何问题或警告。某些熊猫更新中发生了一些变化。
如果我将存储代码更改为
self().loc[name, 'tr'] = tr
self().loc[name, 'eod'] = eod
我收到一个错误ValueError: Incompatible indexer with DataFrame
。
有趣的是,如果我手动执行与原始代码完全相同的操作:accs().loc['name']['tr'] = tr
,那么一切都很好。不会引发任何错误/警告,并且DataFrame可以很好地存储在Series中。在班级内部使用这个有什么问题?