Python 熊猫:连接两个数据帧并应用过滤器
我有两个数据帧 数据帧1Python 熊猫:连接两个数据帧并应用过滤器,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
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吗?