在我找到解决问题的方法之前,我一直在徘徊,我想问一下社区里的人,你们是否有比我想到的更好的主意。
我的问题如下:
我有两个表(一个表是我的源数据,另一个是映射),我想通过某个键合并。在源数据中,我有两个日期:Date_1
和Date_2
在我的映射中,我有四个日期:Date_1_begin, Date_1_end, Date_2_begin, Date_2_end
问题是:这些日期是我密钥的一部分。
例如:
df
A B date
0 1 A 20210310
1 1 A 20190101
2 3 C 19981231
mapping
A B date_begin date_end code
0 1 A 19600101 20201231 1
1 1 A 20210101 20991231 2
2 3 C 19600101 20991231 3
这个想法是:做这样的事情:pd.merge(df, mapping, on = ['A','B'])
将为密钥1_A提供两个代码:1
和2
。但是我想要一个1-1的关系。
为了分配考虑日期的正确代码,我使用piecewise
做了这样的事情fromnumpy
library:
df_date= df['date'].values
conds = [(df_date >= start_date)&(df_date<= end_date)] for start_date, end_date in zip(mapping.date_begin.values, mapping.date_end.values)]
result = np.piecewise(np.zeros(len(df)), conds, mapping['code'].values)
df['code'] = result
它工作得很好…但我想它一定存在于某个更容易、更优雅的地方……
提前感谢!Clem
您需要为重复行添加枚举:
(df1.assign(enum=df1.groupby(['A','B'].cumcount())
.merge(df2.assign(enum=df2.groupby(['A','B']).cumcount()),
on=['A','B','enum'])
)