我的问题是我的数据框包含所有开始和结束日期以及每种类型的相应ID。我想使用此数据框根据日期将id分配给另一个数据框。具体来说,如果第二个数据框中的日期位于第一个数据框的开始日期和结束日期之间,则它将被标记为与第一个相同的ID。
#Here are two data frames
m1=pd.DataFrame({'type':['A','A','A','B','B','B'],
'id':[1,2,3,1,2,3],
'startdate':[20120201,20120301,20130401,20130301,20130501,20140601],
'enddate':[20120218,20120324,20130425,20130312,20130521,20140706]})
m2=pd.DataFrame({'type':['A','A','B','B'],
'pin':[12,33,25,47],
'date':[20120213,20130411,20130504,20140704]})
#ideally the result should be
m3=pd.DataFrame({'type':['A','A','B','B'],
'pin':[12,33,25,47],
'date':[20120213,20130411,20130504,20140704],
'id':[1,3,2,3]})
我无法找到更好的方法来做到这一点。因为有数百万条记录,我需要一种更有效的方式来运行代码。有任何想法吗?非常感谢你!
答案 0 :(得分:1)
这是我解决您问题的方法。
实际上,我将尝试使用merged / join将m1和m2连接成一个数据帧。
获得合并后的数据框后,我将进行测试以确保'date'列在'startdate'和'enddate'
内失败因此,您的代码将如下所示
## merged dataframe
df_merged = pd.merge(m2, m1, how='inner', left_on='type', right_on='type')
## create function to check that date fails between start and end date
f = lambda x : x if x['date'] > x['startdate'] and x['date'] < x['enddate'] else None
## apply function to dataframe
df_merged=df_merged.apply(f, axis=1)
## drop na values
df_merged.dropna()
答案 1 :(得分:0)
实际上接受的答案对我不起作用,因为我在评论中提到的数据很奇怪,所以我从另一种方式得到了结果:
## merged dataframe
df_merged = pd.merge(m2, m1, how='inner', left_on='type', right_on='type')
## create the index(True and False) of the rows you want to keep
keepindex =(df_merged['date'] > df_merged['startdate']) & (df_merged['date'] < df_merged['enddate'])
## subset the data frame by the index
df_merged=df_merged[keepindex]