熊猫-在多种条件下比较和操作两个数据框

问题描述

我正在为一个大学项目设计我想使用关联分析(Apriori算法)的项目。作为数据基础,我有两个数据框。

其中之一是具有列条款articleNumber和时间戳记:

Clickstream
    term     articleNumber     timestamp
    queryC   2547              2018-09-27 18:26:58
    queryU   2157              2018-09-28 14:30:01

另外一个术语和时间戳:

Queries
    term                     timestamp
    queryA                   2018-09-27 18:26:47
    queryB                   2018-09-27 18:26:52
    queryC                   2018-09-27 18:26:58
    queryX                   2018-09-28 14:29:49
    queryP                   2018-09-28 14:30:00
    queryU                   2018-09-28 14:30:01

我想做的是比较两个数据帧,因此我使用术语和时间戳。如果clickstream.timestamp -query.timestamp之间的差异小于10秒,并且期限相等,那么我想用clickstream的articleNumber代替查询期限。这样查询数据框看起来像这样:

Queries
        term                     timestamp
        queryA                   2018-09-27 18:26:47
        queryB                   2018-09-27 18:26:52
        2547                     2018-09-27 18:26:58
        queryX                   2018-09-28 14:29:49
        queryP                   2018-09-28 14:30:00
        2157                     2018-09-28 14:30:01

此后,我想从下到上遍历Queries数据框,并且如果当前项之前的项不是数字,并且当前时间戳和数据集之前的时间戳之间的差小于5分钟,我希望将这些术语放到新数据框的一栏中,以便最终结果如下所示:

 journey
    id     terms
    1      2547,queryB,queryA
    2      2157,queryP,queryX,queryC,queryA

任何有关如何实现这一目标的技巧都将受到赞赏。

解决方法

df_q=pd.DataFrame({
    'term':['queryC','queryU'],'articleNumber':[2547,2157],'timestamp':['2018-09-27 18:26:58','2018-09-28 14:30:01']
})

任务1

df_q.timestamp=pd.to_datetime(df_q.timestamp)

df_c=pd.DataFrame({
    'term':['queryA','queryB','queryC','queryX','queryP','timestamp':['2018-09-27 18:26:47','2018-09-27 18:26:52','2018-09-27 18:26:58','2018-09-28 14:29:49','2018-09-28 14:30:00','2018-09-28 14:30:01']
})
df_c.timestamp=pd.to_datetime(df_c.timestamp)

df_cq=pd.merge_asof(df_c,df_q,tolerance=pd.Timedelta("10s"),on='timestamp')
df_cq.loc[df_cq.term_y.notna(),'term_x']=df_cq.loc[df_cq.term_y.notna(),'articleNumber']

task1_df =df_cq[['term_x','timestamp']]

print(task1_df)


   term_x           timestamp
0  queryA 2018-09-27 18:26:47
1  queryB 2018-09-27 18:26:52
2    2547 2018-09-27 18:26:58
3  queryX 2018-09-28 14:29:49
4  queryP 2018-09-28 14:30:00
5    2157 2018-09-28 14:30:01

任务2

df_test = df_cq.dropna()
df_all=pd.DataFrame()

for index,row  in df_test.iterrows():
    row=pd.DataFrame(row).transpose()
    rows = pd.merge_asof(df_cq,row,tolerance=pd.Timedelta('5m'),on='timestamp')
    rows.articleNumber_y = rows.articleNumber_y.bfill()
    rows=rows.dropna(subset=['articleNumber_y'])
    df_all = df_all.append(rows)

df_all.term_x_x=df_all.term_x_x.astype(str)

df_all = df_all[
    df_all.term_x_x.str.isalpha()
][['term_x_x','timestamp','articleNumber_y']]

    df_all=df_all.groupby('articleNumber_y').agg({'term_x_x':lambda x: ','.join(x)})

print(df_all)



                                    term_x_x
articleNumber_y                             
2157.0           queryA,queryB,queryX,queryP
2547.0                         queryA,queryB

对于2157,没有queryC,因为您已经根据需要将其替换为articleNumber