如何将列表附加到pandas数据框作为新行

时间:2018-02-27 12:27:26

标签: python pandas dataframe tuples

我尝试创建pandas.DataFrame来记录每笔交易记录。

这是我创造的:

def create_blotter():
    blotter = []
    return blotter

def create_blotter_columns():
    columns = ['Buy|Sell', 'Ticker', 'Volume', 'PricePerShare', 'Timestamp', 'TotalCosts']
    return columns


class Ledger:

    _blotter = create_blotter()
    _blotter_columns = create_blotter_columns()

    def update_blotter(self, side, ticker, quantity, price, timestamp, transaction):
    columns = self._blotter_columns
    line = [side, ticker, quantity, price, timestamp, transaction]
    self._blotter.append(line)
    self._blotter = pd.DataFrame(self._blotter, columns=columns)
    self._blotter.sort_index(ascending=False)
    return self._blotter

我这样做的原因是,当我按如下方式创建了吸墨纸和列时,它会返回元组,因此我无法为其添加新的列表行。

def create_blotter_frame():
    blotter = []
    columns = ['Buy|Sell', 'Ticker', 'Volume', 'PricePerShare', 'Timestamp', 'TotalCosts']
    return blotter, columns

无论如何,第一个代码第一次工作,但它返回错误信息:

RuntimeWarning: '<' not supported between instances of 'str' and 'int', sort order is undefined for incomparable objects
  result = result.union(other)

第一次我不能理解它是如何工作的,第二次它会返回这样的错误。该列表应该能够处理任何类型的数据。

我的目标是记录所有交易记录并将其汇总为line并将其附加到blotter并最终显示每笔交易记录。

示例数据如下:

side = 'Buy'
ticker = 'AAPL'
quantity = 100
price = 100
timestamp = "2018-02-27 23:12:50"
transaction = 100000

每个事务都会创建带时间戳的新值。

1 个答案:

答案 0 :(得分:3)

您可以使用pandas.Dataframe.append()

代码:

blotter.append(
    dict(zip(columns, (side, ticker, quantity, price, timestamp, transaction))),
    ignore_index=True).set_index('Timestamp').sort_index(ascending=False)

测试代码:

class Ledger:
    columns = ('Side', 'Ticker', 'Volume', 'PricePerShare',
               'Timestamp', 'TotalCosts')

    def __init__(self):
        self._blotter = pd.DataFrame([], columns=self.columns).set_index(
            'Timestamp')

    def update_blotter(self, side, ticker, quantity, price, timestamp,
                       transaction):
        self._blotter = self._blotter.append(
            dict(zip(self.columns, (
                side, ticker, quantity, price, timestamp, transaction))),
            ignore_index=True).set_index('Timestamp').sort_index(
            ascending=False)
        return self._blotter

    @property
    def blotter(self):
        return self._blotter

ledger = Ledger()
ledger.update_blotter(
    side='Buy',
    ticker='AAPL',
    quantity=100,
    price=100,
    timestamp="2018-02-27 23:12:50",
    transaction=100000,
)
print(ledger.blotter)

结果:

                    Side Ticker  Volume  PricePerShare  TotalCosts
Timestamp                                                         
2018-02-27 23:12:50  Buy   AAPL   100.0          100.0    100000.0