将熊猫数据框存储在系列/数据框内

时间:2020-09-13 11:59:33

标签: python pandas dataframe

在一些Pandas更新之后(现在使用v1.1.1),我在系列中存储DataFrame的代码已损坏。我正在使用一个类来管理包含标识信息和交易列表的不同帐户的DataFrame。以前,下面的代码可以正常工作,并将treod 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中。在班级内部使用这个有什么问题?

0 个答案:

没有答案