给定多个条件,将新列添加到数据框第二个数据框

时间:2019-05-06 01:32:41

标签: python pandas dataframe apply

我正在通过apply方法将多条件lambda函数传递给第二个数据帧,如果其值与第一个数据帧的相关值相符,则应该在第二个数据帧和第一个数据帧之间添加一个独立的列。

在这种情况下,我想检查DF2的作者是否与DF1的作者匹配,以及DF2中的日期是否介于start之间和DF1的end个日期。如果满足所有条件,则将source添加到DF1

到目前为止,这是我的代码。条件似乎已经解决,但是运行时似乎对此提出了质疑,因为我什么也没有得到任何输出。

def add_source(x):
    source_match = master_source.apply(lambda y: y['source'] if
                                                    (y['viewed_date'] >= x['start_date'] 
                                                     and y['viewed_date'] <= x['end_date'] and 
                                                    x['market'] == y['market']) 
                                                    else None, axis=1)
    source_match = source_match.dropna(axis=0, how='all')
    if source_match.empty:
        source_match = np.nan
    else:
        source_match = source_match.to_string(index=False)
    return source_match

1 个答案:

答案 0 :(得分:0)

一种更好的方法是创建一个将在应用中使用的函数,如下所示:

def add_source(row):
    matches = df2[
        (df2['author'] == row['author']) &
        (df2['date'].between(row['start'], row['end']))
    ]

    source = matches['source'].values[0] if len(matches) > 0 else None

    row.loc['source'] = source

    return row

df1 = df1.apply(add_source, axis=1)

像您一样简化逻辑(以及使您编写的lambda函数更具可读性)。该函数逐行循环通过df1,将df1中的特定值与df2中的特定值(即具有相同author且其date落入的那些)进行比较。 startend之间的值,如果存在匹配项(.values[0]的目的),则返回第一个匹配项(len(matches) > 0的含义),否则返回{ {1}}。

然后将该值作为名为None的列分配给该行。

另一种方法是只合并然后像这样创建一个新列:

source

这种方法(我可以看到)的唯一缺点是重复项。