【发布时间】:2021-06-08 14:14:37
【问题描述】:
在找到解决问题的方法之前,我已经徘徊了很多次,我想问问社区你是否有比我想出的更好的主意。
我的问题如下:
我有两张表(一张是我的源数据,另一张是映射),我想通过某个键合并。
在我的源数据中,我有两个日期: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 做了类似的事情
来自numpy库:
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
而且它工作得很好......但我认为它一定存在于某个更简单、更优雅的地方......
提前非常感谢! 克莱姆
【问题讨论】:
-
是
date_begin故意等于1960101吗? -
对不起,应该是 19600101... 干得好