簡體   English   中英

Pandas - 如何根據其他列減去行值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM