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