如何解决Pandas:如何获取一列中每个项目的最后一个每日值,并从每行中的值中减去它
考虑以下数据框,其时间戳索引可能具有重复(即非唯一)索引值,另一列指示资产,另一列包含该资产在该时间戳的值。
df
value asset
2021-03-18 11:00:00 4 A
2021-03-18 11:30:00 1 B
2021-03-18 12:00:00 3 A
2021-03-18 12:30:00 2 A
2021-03-18 13:00:00 3 A
2021-03-18 13:30:00 3 A
2021-03-18 14:00:00 1 A
2021-03-18 14:30:00 2 B
对于每一天,我想获得每项资产的最终价值,并从每行每项资产的价值中减去该价值。因此在上表中,资产 A 的最后一天值为 1(时间 2021-03-18 14:00:00),资产 B 的最后一天值为 2(时间 2021-03-18 14:30:00)。然后我想从每一行的相应资产价值中扣除这些价值。所以在第一行我想计算 new_value
等于 4-1 = 3,第二行是 1-2 = -1。
我该怎么做,考虑到某些指数值可能会重复,因为它们代表每个资产的交易时间,并且可能同时交易两个资产。
解决方法
您可以将 groupby/transform
与 "last"
函数一起使用:
df["new_value"] = df["value"] - df.groupby("asset")["value"].transform("last")
print(df)
value asset new_value
2021-03-18 11:00:00 4 A 3
2021-03-18 11:30:00 1 B -1
2021-03-18 12:00:00 3 A 2
2021-03-18 12:30:00 2 A 1
2021-03-18 13:00:00 3 A 2
2021-03-18 13:30:00 3 A 2
2021-03-18 14:00:00 1 A 0
2021-03-18 14:30:00 2 B 0
groupby/transform
操作只是按“资产”对我们的值进行分组,并从每个组中获取“最后一个”元素。然后它将这些值映射回它们的原始组 - 因此该组中的每个元素都成为“最后一个”元素。从那里我们在具有相同形状的 2 个数组之间进行简单的减法。
s = df.groupby("asset")["value"].transform("last")
print(s)
2021-03-18 11:00:00 1
2021-03-18 11:30:00 2
2021-03-18 12:00:00 1
2021-03-18 12:30:00 1
2021-03-18 13:00:00 1
2021-03-18 13:30:00 1
2021-03-18 14:00:00 1
2021-03-18 14:30:00 2
Name: value,dtype: int64
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。