Python 熊猫-如何基于其他列减去行值?
输入: 期望输出:Python 熊猫-如何基于其他列减去行值?,python,pandas,Python,Pandas,输入: 期望输出: 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 如何在熊猫中实现此输出?我试过grou
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
如何在熊猫中实现此输出?我试过groupby,但这对值列有效。我想根据符号+类型减去行的值。比如(符号+买入->价值)减去(符号+卖出->价值)让我们试试看
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
如果需要,将销售转换为pos
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
我不知道这是否是最好的解决方案,但它肯定会起作用:
您可以使用Numpy将pandas矩阵转换为数组,通过该数组可以循环、搜索值等。对于Buy类型的列和Sell subtract类型的下一行中的havin示例(我希望我在这里得到了您的问题,很抱歉有任何误解),您可以简单地使用一个For循环来生成两个数组,一个是Sell类型,一个是Buy类型,然后从第一个数组中减去值1,从第二个数组中减去值1或类似的值。这肯定不如这个问题的另一个答案好,至少在这种情况下不是这样,但我确实相信,在某些情况下,这可能会更好,例如,因为numpy允许您重塑阵列循环似乎不是最好的选择。在任何情况下,OP都很可能会找到一些更有用的代码来说明如何实现这一点。理解它花了一些时间。还在弄明白为什么要使用*=运算符。。。
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