我对Pandas 比较陌生,在这里寻找解决方案后,我一直未能找到任何能很好地解释我问题的方法.

我有这样一个数据框架(df_事务):

 col_type      col_ticker      col_transacted_value
 'buy'         'TSLA'          '100'                           
 'buy'         'TSLA'          '100'                           
 'buy'         'TSLA'          '100'                           
 'sell'        'TSLA'          '300'                              
 ...           ...             ...

我想创建两个新的专栏,包括之前的累计成本和累计成本.

要获得我之前使用的成本:

df_transactions[col_prev_cost] = df_transactions.groupby(col_ticker)[col_transacted_value].shift().fillna(0)

但后来意识到,这只会找到以前出现的那个股票代码,并用它的交易成本填充一个新列.

我的 idea 是按股票代码分组,根据col_type的值填充一个新列"col_prev_costs",并用该列创建一个新列"cml_cost".或者,如果你看到一个更简单的方法——分享!

我希望它能像这样运行:


 col_type      col_ticker      col_transacted_value        New_col_prev_cost       New_col_cml_cost
 'buy'         'TSLA'          '100'                       '0'                     '100'
 'buy'         'TSLA'          '100'                       '100'                   '200'
 'buy'         'TSLA'          '100'                       '200'                   '300'
 'sell'        'TSLA'          '300'                       '300'                   '0'     
 ...           ...             ...                         ...                      ...

我愿意接受所有建议!

提前谢谢!/雅各布

推荐答案

以下是一种方法:

import pandas as pd

df = pd.DataFrame(data={"col_type": ["buy", "buy", "buy", "sell", "buy", "sell", "buy"],
                        "col_ticker": ["TSLA", "TSLA", "TSLA", "TSLA", "AAPL", "AAPL", "AAPL"],
                        "col_transacted_value": ["100", "100", "100", "300", "150", "200", "100"]})

df["col_transacted_value"] = df["col_transacted_value"].astype(int)
df["col_transacted_value_signs"] = df.apply(lambda x: -x["col_transacted_value"] if x["col_type"] == "sell" else x["col_transacted_value"], axis=1)
df = df.groupby("col_ticker").apply(lambda grp: grp.assign(New_col_cml_cost=grp["col_transacted_value_signs"].cumsum(),
                                                           New_col_prev_cost=grp["col_transacted_value_signs"].shift(1).cumsum().fillna(0)))

解释如下:

  • 将字符串值转换为整数(如果愿意的话,也可以浮动)
  • 使用-ve创建一个新列
  • 最后,按col_ticker分组,并使用apply分配新列

我从krassowski年前的 comments 中获得了groupby应用分配 idea 的灵感.

输出(TSLA与您的示例类似):

#Out: 
#             col_type col_ticker  ...  New_col_cml_cost  New_col_prev_cost
#col_ticker                        ...                                     
#AAPL       4      buy       AAPL  ...               150                0.0
#           5     sell       AAPL  ...               -50              150.0
#           6      buy       AAPL  ...                50              -50.0
#TSLA       0      buy       TSLA  ...               100                0.0
#           1      buy       TSLA  ...               200              100.0
#           2      buy       TSLA  ...               300              200.0
#           3     sell       TSLA  ...                 0              300.0
#
#[7 rows x 6 columns]

Python相关问答推荐

如何最好地处理严重级联的json

隐藏QComboBox的指示器(qdarkstyle)

单击Python中的复选框后抓取数据

PyQt5如何将pyuic 5生成的Python类添加到QStackedWidget中?

更改Seaborn条形图中的x轴日期时间限制

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

Python -根据另一个数据框中的列编辑和替换数据框中的列值

Python会扔掉未使用的表情吗?

对Numpy函数进行载体化

韦尔福德方差与Numpy方差不同

numba jitClass,记录类型为字符串

如果值不存在,列表理解返回列表

当从Docker的--env-file参数读取Python中的环境变量时,每个\n都会添加一个\'.如何没有额外的?

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

多指标不同顺序串联大Pandas 模型

如何启动下载并在不击中磁盘的情况下呈现响应?

如何合并两个列表,并获得每个索引值最高的列表名称?

通过ManyToMany字段与Through在Django Admin中过滤

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

pandas:对多级列框架的列进行排序/重新排序