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)
结果当然是一样的。
添加回答
举报