如何将两个表与键中的日期合并(Python)

Posted

技术标签:

【中文标题】如何将两个表与键中的日期合并(Python)【英文标题】:How do I merge two tables with dates within the key (Python) 【发布时间】:2021-06-08 14:14:37 【问题描述】:

在找到解决问题的方法之前,我已经徘徊了很多次,我想问问社区你是否有比我想出的更好的主意。

我的问题如下:

我有两张表(一张是我的源数据,另一张是映射),我想通过某个键合并。 在我的源数据中,我有两个日期:Date_1Date_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 的代码:12。但我想要一个 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)的主要内容,如果未能解决你的问题,请参考以下文章

如何将两个表与对应相同id号的相同行数合并在一起?

Oracle:将两个表与一个公共列加上第二个表中的一个附加列(最新生效日期)连接以选择其他列

Pandas 在键中与 NaN 合并

如何将 DataFrame 中两列中的两个日期和时间合并为一列? [复制]

如何在 C# 中使用 csvHelper 将两个单独列中的日期和时间合并到一个新的日期时间列中

合并 OBIEE12C 中的两个表