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

标签 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)

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

我的目标是记录所有交易记录并将它们聚合为并将其附加到记事本并最终显示每条交易记录。

示例数据如下:

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

每笔交易都会创建带有时间戳的新值。

最佳答案

您可以使用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

关于python - 如何将列表作为新行附加到 pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49008713/

相关文章:

python - 从 ANSI 转换为 UTF-8

python - 用括号中的数字Python替换字符串中的数字

python - 为 panda 数据帧创建 x 和 y 坐标和时间戳的多重索引

python - 在pandas Dataframe的一列中找到增加,减少

python - 如何标准化不同范围内数据帧列中的值

python - Pandas 数据框,索引不正确

python - self 参数在功能上为什么不同?

python - Groupby 类和计数特征中的缺失值

python - 如何在 Dataframe 中保存排序顺序?

r - 使用 Shiny 中的 rclipButton 从数据框中复制文本