使用行/列引用从另一个数据框中的两个列值获取数据

时间:2019-09-19 04:59:17

标签: python dataframe

df1

       Date    APA     AR  BP-GB   CDEV  ...    WLL    WPX     XEC    XOM  CL00-USA
0 2018-01-01  42.22  19.00  5.227  19.80  ...  26.48  14.07  122.01  83.64     60.42
1 2018-01-02  44.30  19.78  5.175  20.00  ...  27.37  14.31  125.51  85.03     60.37
2 2018-01-03  45.33  19.78  5.242  20.33  ...  27.99  14.39  126.20  86.70     61.63
3 2018-01-04  46.84  19.80  5.300  20.37  ...  28.11  14.44  128.66  86.82     62.01
4 2018-01-05  46.39  19.44  5.296  20.12  ...  27.79  14.24  127.82  86.75     61.44

df2

        Date Ticker Event_Type Event_Description   Price  add
0 2018-11-19    XEC        M&A               REN   88.03    1
1 2018-03-28    CXO        M&A              RSPP  143.25    1
2 2018-08-14   FANG        M&A               EGN  133.75    1
3 2019-05-09    OXY        M&A               APC   56.33    1
4 2019-08-26   PDCE        M&A              SRCI   29.65    1

我的目标是通过使用df2 ['Ticker']和df2 ['Date']从df1中提取值来更新df2。['add'] ...例如,df2中的第一行是XEC 2018-11-19 ...代码需要首先查看df1 [XEC],然后在df [Date]中拉出与2018-11-19行匹配的值

我的尝试是:

df_Events['add'] = df_Prices.loc[[df_Prices['Date']==df_Events['Date']],[df_Prices.columns==df_Events['Ticker']]]

2 个答案:

答案 0 :(得分:0)

尝试:

df2 = df2.merge(df1.melt(value_vars=df1.columns.tolist()[1:], id_vars='date', value_name="add", var_name='Ticker').reset_index(), how='left')`

这应将df1 Tickers列更改为单个列,然后将该列中的值合并为df2。

答案 1 :(得分:0)

另一种方法可能如下(我已经开始研究它,所以即使您已经接受了答案,我也要放在这里)

首先在两个数据框中将日期转换为datetime对象,并在第一个数据集(下面的代码)中将其设置为ony

df1['Date']=pd.to_datetime(df1['Date'])
df1.set_index('Date',inplace=True)
df2['Date']=pd.to_datetime(df2['Date'])

然后使用apply获取每个列的值。

df2['add']=df2.apply(lambda x: df1.loc[(x['Date']),(x['Ticker'])], axis=1)

仅当两个数据框中都存在所有股票的日期和值时,此方法才起作用(因此将抛出为“ KeyError”