首页 > 解决方案 > 从另一行获取一个值并根据当前行中包含的特定信息添加到当前行 - 对于整个数据框

问题描述

尽管我知道如何根据某些数据获取特定行的信息(尤其是关于此的坚如磐石的答案),但我正在努力找出对整个数据框执行此操作的最佳方法,希望如此无需遍历它

我有“买入”和“卖出”交易的记录,都在同一个 df 中。触发每个“购买”交易的原因记录在保存“购买”交易的相应行中。我需要将该信息复制到等效的“销售”交易中。卖出交易行包含“买入”交易的“ID”,它们是 df 的索引。

     Type   Trigger   Buy ID
ID   
11   buy     AA       ---
12   buy     BB       ---
13   sell    ---      11
14   sell    ---      12

所以我想创建一个新列(例如“BuyTrigger”)并将“买入”交易的触发器添加到“卖出”行。我尝试过的(除其他外):

df = data[data["Type"] == "sell"]
df["BuyTrigger"] = data.loc[df["Buy order ID"]]["Trigger"]

上面,我创建了一个包含销售交易的数据片段的副本,只是为了加快处理速度。购买将返回“购买触发器”的所有 NAN。

只是为了让它超级清楚:有两个数据框。DATA 包含所有记录;DF 仅包含卖出交易。

预期结果:

     Type   Trigger   Buy ID  BuyTrigger
ID   
11   buy     AA       ---     --- 
12   buy     BB       ---     ---
13   sell    ---      11      AA
14   sell    ---      12      BB

我感谢您的帮助!

标签: pythonpython-3.xpandasdataframe

解决方案


您可以使用 apply 和 df.loc 来获得答案。这就是我将如何做到的。

import pandas as pd
import numpy as np
df = pd.DataFrame({'ID':[11,12,13,14],
                   'Type':['buy','buy','sell','sell'],
                   'Trigger':['AA','BB','---','---'],
                   'Buy_ID':['---','---',11,12]}).set_index('ID')
df["BuyTrigger"] = df['Buy_ID'].apply(lambda x: df.loc[x,'Trigger'] if x != '---' else np.NaN)
print (df)

这个的输出是:

    Type Trigger Buy_ID BuyTrigger
ID                                
11   buy      AA    ---        NaN
12   buy      BB    ---        NaN
13  sell     ---     11         AA
14  sell     ---     12         BB

除了 np.NaN,你也可以给出 '---'。那么答案将是:

    Type Trigger Buy_ID BuyTrigger
ID                                
11   buy      AA    ---        ---
12   buy      BB    ---        ---
13  sell     ---     11         AA
14  sell     ---     12         BB

推荐阅读