从另一个数据框添加值

时间:2020-09-27 04:03:41

标签: python pandas dataframe

我有一个df1

    Date         Open         Expiry    Entry Strike
0   2020-01-03  12261.10    2020-01-09  12200.0
1   2020-01-10  12271.00    2020-01-16  12200.0
2   2020-01-17  12328.40    2020-01-23  12300.0
3   2020-01-24  12174.55    2020-01-30  12100.0
4   2020-01-31  12100.40    2020-02-06  12100.0

我想从df2添加值

    Date         Expiry    Type  Strike Price   Open    Close
0   2020-01-03  2020-01-09  CE     13100         0.0    65.85
1   2020-01-03  2020-01-09  CE     13150         0.0    59.40
2   2020-01-03  2020-01-09  CE     13200         0.0    53.55
3   2020-01-03  2020-01-09  CE     13250         0.0    48.15
4   2020-01-03  2020-01-09  CE     13300         0.0    43.25

我想将列Date , Expiry and Entry Price的元素与df2的Date ,Expiry and Strike Price进行比较,如果条件匹配,则将相应的Open列元素添加到df1。当我直接比较列时,出现类似的错误。

ValueError: Can only compare identically-labeled Series objects

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您尝试进行简单的合并,看看它是否可以解决您想要的问题。

执行以下操作:

pd.merge(df1,df2,how='left', left_on=['Date','Expiry','Entry Strike'], right_on=['Date','Expiry','Strike Price'])

您的输出将如下所示。为此,我修改了第一行以使其匹配。否则,数据将没有匹配的记录。

         Date    Open_x      Expiry  ...  Strike Price Open_y  Close
0  2020-01-03  12261.10  2020-01-09  ...       12200.0    0.0  43.25
1  2020-01-10  12271.00  2020-01-16  ...           NaN    NaN    NaN
2  2020-01-17  12328.40  2020-01-23  ...           NaN    NaN    NaN
3  2020-01-24  12174.55  2020-01-30  ...           NaN    NaN    NaN
4  2020-01-31  12100.40  2020-02-06  ...           NaN    NaN    NaN

然后您可以删除所有不需要的列。

答案 1 :(得分:1)

您也可以尝试应用Apply功能

from sklearn.metrics import precision_recall_fscore_support
precision_recall_fscore_support(y_true, y_pred, average='macro')

这也将起作用,请检查下面的输出,我更改了其中一个值以匹配一行。

def check(row):
    dt = row['Date']
    ex = row["Expiry"]
    sp = row["Entry Strike"]
    return df2[(df2['Date']==dt) & (df2['Expiry']==ex) & (df2["Strike Price"]==sp)]['Open']

df1['new_col'] = df1.apply(lambda x:  check(x), axis = 1)