我正在通过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
答案 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
落入的那些)进行比较。 start
和end
之间的值,如果存在匹配项(.values[0]
的目的),则返回第一个匹配项(len(matches) > 0
的含义),否则返回{ {1}}。
然后将该值作为名为None
的列分配给该行。
另一种方法是只合并然后像这样创建一个新列:
source
这种方法(我可以看到)的唯一缺点是重复项。