如何将两个表与键中的日期合并(Python)
Posted
技术标签:
【中文标题】如何将两个表与键中的日期合并(Python)【英文标题】:How do I merge two tables with dates within the key (Python) 【发布时间】: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... 干得好
【参考方案1】:
您需要为重复的行添加枚举:
(df1.assign(enum=df1.groupby(['A','B'].cumcount())
.merge(df2.assign(enum=df2.groupby(['A','B']).cumcount()),
on=['A','B','enum'])
)
【讨论】:
非常感谢。这很优雅:)) 问题是,事实上,它不包括日期背后的信息。 df1 的第一行应该分配给代码 2。事实上,如果我合并 df1 和 df2 它不会是这种情况。但我喜欢你的方法,并会尝试从那里开始;)非常感谢再次 它应该使用正确的sort_values()
method :))以上是关于如何将两个表与键中的日期合并(Python)的主要内容,如果未能解决你的问题,请参考以下文章
Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列
如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]