Python 从另一行获取一个值,并根据当前行中包含的特定信息将其添加到当前行-用于整个数据帧

Python 从另一行获取一个值,并根据当前行中包含的特定信息将其添加到当前行-用于整个数据帧,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,尽管我知道如何根据一些数据(尤其是关于这些数据的数据)获取特定行的信息,但我仍在努力找出对整个数据帧执行此操作的最佳方法,希望不必循环 我有“买入”和“卖出”交易的记录,都在同一个df中。触发每个“买入”交易的内容记录在保存“买入”交易的相应行中。我需要将这些信息复制到等价的“卖出”交易中。卖出交易行包含“买入”交易的“ID”,这是df的索引 Type Trigger Buy ID ID 11 buy AA --- 12 buy BB

尽管我知道如何根据一些数据(尤其是关于这些数据的数据)获取特定行的信息,但我仍在努力找出对整个数据帧执行此操作的最佳方法,希望不必循环

我有“买入”和“卖出”交易的记录,都在同一个df中。触发每个“买入”交易的内容记录在保存“买入”交易的相应行中。我需要将这些信息复制到等价的“卖出”交易中。卖出交易行包含“买入”交易的“ID”,这是df的索引

     Type   Trigger   Buy ID
ID   
11   buy     AA       ---
12   buy     BB       ---
13   sell    ---      11
14   sell    ---      12
因此,我想创建一个新列(例如“BuyTrigger”),并将“buy”事务中的触发器添加到“sell”行中。我尝试过的(除其他外):

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

让我们非常清楚:有两个数据帧。数据包含所有记录;DF仅包含销售交易记录

预期结果:

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

我感谢你的帮助

下面是一段代码片段,它可以实现您想要的功能:

import pandas as pd

def handle(data):
    buy = data[data["Type"]=="buy"][["ID", "Trigger"]]
    df = data.merge(buy, left_on="Buy ID", right_on="ID", how="left", suffixes=("", "_"))
    df = df.drop(["ID_"], axis=1).rename(columns={"Trigger_": "BuyTrigger"})
    return df

data = pd.DataFrame({
    "ID": [11,12,13,14],
    "Type": ["buy", "buy", "sell", "sell"],
    "Trigger": ["AA", "BB", "", ""],
    "Buy ID": ["", "", 11, 12]
})
result = handle(data)
其工作原理如下:

  • 选择包含购买信息的行
  • 合并表以查找每次购买对应的卖出
  • 根据您的描述删除/重命名列

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

    我觉得这太复杂了。使用apply和df.loc有一种更简单的方法
        Type Trigger Buy_ID BuyTrigger
    ID                                
    11   buy      AA    ---        ---
    12   buy      BB    ---        ---
    13  sell     ---     11         AA
    14  sell     ---     12         BB