我想将2张桌子合为1张,即公司公告日期和当天的价格(在另一张桌子上)
我有2个数据框,以下几列
df1: date, announcement, ticker
date ticker announcement
25/4/2013 AAPL Change in Boardroom
25/4/2013 GOOG OTHERS
25/4/2013 AMZN Change in Audit Committee
df2: date, ticker, price
date ticker announcement
22/3/2012 AAPL 100.00
23/3/2012 AAPL 102.30
24/3/2012 AAPL 105.40
...
...
def getPrice(dt,tk):
try:
return df2[(df2['date']>=dt)&(df2['ticker']==tk)].sort_values(by='date')['price'].values[0]
except:
return 0
prices_array = list(map(getPrice,df1['date'].values,df1['ticker'].values))
df1['price'] = prices_array
对于“地图”功能,整个过程需要很长时间。我很想使用apply for df,但我只知道如何将lambda函数与不包含“ if,then”的函数一起使用。
我想要这样一个额外的列:
date ticker announcement price
25/4/2013 AAPL Change in Boardroom 124.10
25/4/2013 GOOG OTHERS 50.85
25/4/2013 AMZN Change in Audit Committee 102.20
关于快速方法的任何建议?还是可以在短时间内完成?
谢谢,感谢您的帮助
答案 0 :(得分:0)
您可以使用DataFrame.apply()
代替def
为lambda
创建函数。预先定义它,然后将函数名称放在lambda所在的位置,就像对map()
所做的一样。
所应用的函数获得一个Series
参数,因此您可以获得整个行。
答案 1 :(得分:0)
我认为您可以使用'.join'
df.set_index(['date', 'ticker']).join(df2.set_index(['date', 'ticker'])