输入:
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)
答案 0 :(得分:1)
让我们尝试
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
如果需要将出售转换为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
答案 1 :(得分:1)
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
答案 2 :(得分:0)
我不知道这是否是最好的解决方案,但它肯定可以工作:
您可以使用Numpy将您的熊猫矩阵转换成一个数组,通过它您可以循环遍历,搜索值等。对于您的示例,买类型为Columns的类型为Sell的下一行减去(I希望我能在这里解决您的问题,对于任何误解表示抱歉),您可以简单地使用一个for循环,该循环使两个数组组成,一个类型为Sell类型,一个类型为Buy类型,然后从第一个数组中减去1的值从第二个值或类似值开始取值为1。对于这个问题,它绝对不如其他答案好,至少在这种情况下不行,但是我确实相信它在某些情况下可能会好得多,例如因为numpy可以让您重塑数组