1 回答

TA貢獻2021條經驗 獲得超8個贊
失敗的第一個原因是你的函數以 return df11.Volume.sum
(不帶括號)結尾,因此你只返回sum函數,而不是其執行結果。
另一個原因是您可以將函數應用于 Dataframe 的每一行,但必須傳遞axis=1參數。但是之后:
要應用的函數應該有一個參數 - 當前行,
其結果可以替換到所需的列下。
失敗的第三個原因是df2包含df1中不存在的日期,因此您不可能找到任何匹配的行。
如何獲得預期結果 - 方法1
首先,df2必須包含可能與df1匹配的值。我將df2定義為:
Ticker Date Price SumVol
0 AAPL 20200501 1.4 0
1 TSLA 20200502 2.3 0
然后我將你的功能更改為:
def VolSum(row):
df11 = pd.DataFrame(df1)
df11 = df11[df11['Ticker'] == row.Ticker]
df11 = df11[df11['Date'] == row.Date]
df11 = df11[df11['High'] < row.Price]
return df11.Volume.sum()
最后我生成的結果為:
df2['SumVol'] = df2.apply(VolSum, axis=1)
結果是:
Ticker Date Price SumVol
0 AAPL 20200501 1.4 250
1 TSLA 20200502 2.3 530
如何獲得預期結果——方法2
但更簡潔優雅的方法是將求和函數定義為:
def VolSum2(row):
return df1.query('Ticker == @row.Ticker and '
'Date == @row.Date and High < @row.Price').Volume.sum()
并以同樣的方式應用它:
df2['SumVol'] = df2.apply(VolSum2, axis=1)
結果當然是一樣的。
添加回答
舉報