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

期望的输出:


 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

如何在 pandas 中实现此输出?我尝试了 groupby 但这适用于 Value 列。我想根据值的符号+类型减去行。就像 (交易品种+买入->价值) 减去 (交易品种+卖出->价值)


慕的地10843
浏览 108回答 3
3回答

慕姐4208626

让我们尝试一下df.Value *= np.where(df.Type=='BUY', 1, -1)out = df.groupby('Symbol', as_index=False).agg({'Type':'first','Value':'sum'})outOut[152]:   Symbol  Type  Value0   AAPL   BUY     901   INFY  SELL   -1902    JSL   BUY    1203    JSW   BUY     204    REL   BUY    1105    TCS   BUY     10如果需要将销售转换为 posout.Value *= np.where(out.Type=='BUY', 1, -1)outOut[157]:   Symbol  Type  Value0   AAPL   BUY     901   INFY  SELL    1902    JSL   BUY    1203    JSW   BUY     204    REL   BUY    1105    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  Value0      AAPL   BUY   90.01      INFY  SELL  190.02       JSL   BUY  120.03       JSW   BUY   20.04       REL   BUY  110.05       TCS   BUY   10.0

噜噜哒

我不知道这是否是最好的解决方案,但它绝对应该有效:您可以使用 Numpy 将 pandas 矩阵转换为数组,通过它您可以循环、搜索值等。对于您的示例,具有 Buy 类型的列和 Sell 类型的下一行减去(我希望我'我在这里解决您的问题,对于任何误解表示抱歉),您可以简单地使用 for 循环来创建两个数组,一个为 Sell 类型,一个为 Buy 类型,然后从第一个数组中减去 Value 1 和 Value 1 从第二个或类似的东西。它绝对不如这个问题的其他答案,至少在这种情况下不是那么好,但我确实相信在某些情况下这可能会好得多,例如因为 numpy 可以让你重塑数组
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python