Python熊猫替代'map'的2个变量的功能

时间:2018-12-04 05:55:22

标签: python pandas dataframe

我想将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

关于快速方法的任何建议?还是可以在短时间内完成?

谢谢,感谢您的帮助

2 个答案:

答案 0 :(得分:0)

您可以使用DataFrame.apply()代替deflambda创建函数。预先定义它,然后将函数名称放在lambda所在的位置,就像对map()所做的一样。

所应用的函数获得一个Series参数,因此您可以获得整个行。

答案 1 :(得分:0)

我认为您可以使用'.join'

df.set_index(['date', 'ticker']).join(df2.set_index(['date', 'ticker'])