根据其他 df 列有条件地创建新列

如果 df1 满足 df2 两列中的两个条件,我想在 df1 中创建一个新的布尔列。例如:


df1:

   ID         Date

01234    8-23-2020

01234    8-26-2020

01235    8-24-2020

01235     9-3-2020

01236     9-1-2020


df2:

   id       visit

01234    8-23-2020

01235     9-3-2020

我想在 df1 中仅将 df2 中的访问设置为“True”,结果如下:


df1:

   ID         Date    In_store

01234    8-23-2020        1

01234    8-26-2020        0

01235    8-24-2020        0

01235     9-3-2020        1

01236     9-1-2020        0

我试过了:


pos_id = df2['id'].tolist()

pos_date = df2['visit'].tolist()


for row in df:

    if df1['ID'].isin(pos_id) and df1['Date'].isin(pos_visit):

        df1['In_store'] = 1

    else: 

        df1['In_store'] = 0

但我得到:“ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。”


我已经尝试过:


for row in df:

    if df1['ID'] == df2['ID'] and df1['Date'] == df2['Date']:

        df1['In_store'] = 1

    else: 

        df1['In_store'] = 0

但我得到:“ValueError:只能比较相同标签的系列对象”,即使将列重命名为相同的列后也是如此。


我缺少什么?谢谢


慕仙森
浏览 90回答 1
1回答

阿波罗的战车

这本质上是合并:merged = df1.merge(df2, left_on=['ID','Date'], right_on=['id','visit'], how='left')df1['In_store'] = merged['visit'].notna().astype(int)输出:     ID       Date  In_store0  1234  8-23-2020         11  1234  8-26-2020         02  1235  8-24-2020         03  1235   9-3-2020         14  1236   9-1-2020         0
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python