Python 熊猫:连接两个数据帧并应用过滤器

Python 熊猫:连接两个数据帧并应用过滤器,python,pandas,dataframe,Python,Pandas,Dataframe,我有两个数据帧 数据帧1 Userid | SessionID | Endtime John | '' | 0910 Paul | '' | 0920 ..... 数据帧2 UserID| SessionID | starttime|end time John | 0 | 0905 | 0915 Jack | 1 | 0900 | 0915 .... 数据帧1有333975行。 数据帧2有2460行 我想用dataframe 1来标记dataframe 2。如果dateframe 1

我有两个数据帧

数据帧1

Userid | SessionID | Endtime
John   | '' | 0910
Paul   | '' | 0920
.....
数据帧2

UserID| SessionID | starttime|end time
John | 0 | 0905 | 0915
Jack | 1 | 0900 | 0915
....
数据帧1有333975行。 数据帧2有2460行

我想用dataframe 1来标记dataframe 2。如果dateframe 1中的用户=用户dataframe 2,并且如果“endtime”介于“starttime”和“endtime”之间,则匹配,将SessionID从dataframe 1复制到dataframe 2

我的代码是这样的:

For i in range(len(df1)) :
    For j in range(len(df2)) :
        if(df1['Userid'][1] == df2['UserID']) :
            if((df1['Endtime'] [i] > df2['starttime'][j]) & (df1['Endtime'] [i] < df2['end time'][j])) 
                df1['SessionID' ][i] = df2['SessionID'][j]
范围内i的
(len(df1)):
对于范围内的j(len(df2)):
如果(df1['Userid'][1]==df2['Userid']):
如果((df1['Endtime'][i]>df2['starttime'][j])和(df1['Endtime'][i]
以前我处理d1的65k时,需要30分钟才能完成。现在333k需要几个小时

有没有更有效的方法来做这种标签

更新: 我也尝试过使用np.where来实现这一点,但这也需要很长时间。它已经运行了2个小时,还在计数

这是我的密码:

df1['SessionID' ][i] = np.where( (df1['Userid'][1] == df2['UserID']) &  (df1['Endtime'] [i] > df2['starttime'][j]) & (df1['Endtime'] [i] < df2['end time'][j]), df2['SessionID'][j], df1['SessionID' ][i]) 
df1['SessionID'][i]=np.where((df1['Userid'][1]==df2['Userid'])和(df1['Endtime'][i]>df2['starttime'][j])和(df1['Endtime'][i]
您可以尝试将第二条“如果”语句的对象管理为熊猫系列或列表,然后如果满足条件,您可以对数据集执行标签操作。

您可以尝试将第二条“如果”语句的对象管理为熊猫系列或列表,然后如果满足条件,您可以对其执行标签操作数据集。

您可以合并两个数据帧并在其上应用筛选器

raw_data = {
    'user_id': ['John', 'Paul'],
    'session_id': [1, 2],
    'end_time' : [910, 920]
}
pd_a = pd.DataFrame(
    raw_data, columns=['user_id', 'session_id', 'end_time']
)

raw_data = {
    'user_id': ['John', 'Paul'],
    'session_id': [1, 2],
    'start_time': [900, 900],
    'end_time' : [915, 925]
}
pd_b = pd.DataFrame(
    raw_data, columns=['user_id', 'session_id', 'start_time', 'end_time']
)

final_pd = pd.merge(pd_a, pd_b, on='user_id')
输出

  user_id  session_id_x  end_time_x  session_id_y  start_time  end_time_y
0    John             1         910             1         900         915
1    Paul             2         920             2         900         925
然后,最后应用您想要的任何过滤器

final_pd[final_pd['end_time_x']<=final_pd['end_time_y']]

final_pd[final_pd['end_time_x']您可以合并两个数据帧并在其上应用过滤器

raw_data = {
    'user_id': ['John', 'Paul'],
    'session_id': [1, 2],
    'end_time' : [910, 920]
}
pd_a = pd.DataFrame(
    raw_data, columns=['user_id', 'session_id', 'end_time']
)

raw_data = {
    'user_id': ['John', 'Paul'],
    'session_id': [1, 2],
    'start_time': [900, 900],
    'end_time' : [915, 925]
}
pd_b = pd.DataFrame(
    raw_data, columns=['user_id', 'session_id', 'start_time', 'end_time']
)

final_pd = pd.merge(pd_a, pd_b, on='user_id')
输出

  user_id  session_id_x  end_time_x  session_id_y  start_time  end_time_y
0    John             1         910             1         900         915
1    Paul             2         920             2         900         925
然后,最后应用您想要的任何过滤器

final_pd[final_pd['end_time_x']<=final_pd['end_time_y']]

final_pd[final_pd['end_time_x']嗨,你能详细说明一下吗?这像是在我的更新中使用np.where吗?嗨,你能详细说明一下吗?这像是在我的更新中使用np.where吗?