我的问题是我有一个数据框,其中包含所有开始日期和结束日期以及每种类型的对应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]})


我想不出更好的方法来做到这一点。因为有数百万条记录,所以我需要一种更有效的方式来运行代码。有任何想法吗?非常感谢!

最佳答案

这是我为您解决的问题。

实际上,我将尝试使用合并/连接将m1和m2一起连接到单个数据帧中。

获得合并的数据框后,我将进行测试以确保“日期”列在“开始日期”和“结束日期”内失败

因此,您的代码将如下所示

## 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()

09-30 23:56
查看更多