[英]Pandas - How to subtract row values based on other columns?
输入:
Symbol Type Value
0 AAPL BUY 400
1 AAPL SELL 310
2 INFY SELL 190
3 JSL BUY 120
4 JSW BUY 190
5 JSW SELL 170
6 REL BUY 110
7 TCS BUY 210
8 TCS SELL 200
期望输出:
Symbol Type Value
0 AAPL BUY 90
2 INFY SELL 190
3 JSL BUY 120
4 JSW BUY 20
6 REL BUY 110
7 TCS BUY 10
我如何在熊猫中实现这个输出? 我尝试过 groupby 但它适用于 Value 列。 我想根据值的符号+类型减去行。 像 (Symbol+BUY->Value) 减去 (Symbol+Sell->Value)
让我们试试
df.Value *= np.where(df.Type=='BUY', 1, -1)
out = df.groupby('Symbol', as_index=False).agg({'Type':'first','Value':'sum'})
out
Out[152]:
Symbol Type Value
0 AAPL BUY 90
1 INFY SELL -190
2 JSL BUY 120
3 JSW BUY 20
4 REL BUY 110
5 TCS BUY 10
如果需要将sell 转换为pos
out.Value *= np.where(out.Type=='BUY', 1, -1)
out
Out[157]:
Symbol Type Value
0 AAPL BUY 90
1 INFY SELL 190
2 JSL BUY 120
3 JSW BUY 20
4 REL BUY 110
5 TCS BUY 10
df2 = df.pivot_table(index='Symbol', columns='Type', values='Value', aggfunc='sum').\
fillna(0).eval('Value = BUY - SELL').drop(columns=['BUY', 'SELL']).reset_index()
df2.insert(1,'Type', np.where(df2['Value'] > 0, "BUY", "SELL"))
df2['Value'] = abs(df2['Value'])
Type Symbol Type Value
0 AAPL BUY 90.0
1 INFY SELL 190.0
2 JSL BUY 120.0
3 JSW BUY 20.0
4 REL BUY 110.0
5 TCS BUY 10.0
我不知道这是否是最好的解决方案,但它绝对应该有效:
您可以使用 Numpy 将您的 Pandas 矩阵转换为一个数组,通过该数组您可以遍历、搜索值等。对于您的示例来说,拥有 Buy 类型的列和 Sell 类型的下一行减去(我希望我我在这里解决了你的问题,抱歉有任何误解),你可以简单地使用一个 for 循环来创建两个数组,一个是 Sell 类型,一个是 Buy 类型,然后从第一个数组中减去 1 的值和值1 从第二个或类似的东西。 对于这个问题,它绝对不如其他答案好,至少在这种情况下不是,但我确实相信它在某些情况下可能会好得多,例如因为 numpy 可以让您重塑数组
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.