python - 从另一行获取一个值并根据当前行中包含的特定信息添加到当前行 - 对于整个数据框
问题描述
尽管我知道如何根据某些数据获取特定行的信息(尤其是关于此的坚如磐石的答案),但我正在努力找出对整个数据框执行此操作的最佳方法,希望如此无需遍历它。
我有“买入”和“卖出”交易的记录,都在同一个 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
我感谢您的帮助!
解决方案
您可以使用 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
推荐阅读
- logging - Promtail 根据选择器创建新标签
- macos - 无法启动客户端 Common Lisp 语言服务器
- javascript - 将 blob 音频正确转换为 webm 格式
- python - 使用来自嵌入式 python 的 pip freeze 和子进程给出 120 返回码
- mysql - SQS 大小限制,但在 Lumen 中使用 DB 没有限制
- javascript - 多个租户 firebaseui 和 gcip-iap 无效配置
- revenuecat - 工作设置现已损坏:RevenueCat Flutter
- c# - 怎样才能深入到孩子的层次?
- swiftui - 无法在 SwiftUI 中使用 Kingfisher 将图像保存到磁盘
- untagged - 缺少必需的参数“event_type”(字符串)