如何基于相同的 ID 比较两个不同数据框中的日期列

Posted

技术标签:

【中文标题】如何基于相同的 ID 比较两个不同数据框中的日期列【英文标题】:how do i compare date columns in two different data frames based on the same ID 【发布时间】:2019-02-26 07:45:19 【问题描述】:

熊猫

我有两个数据框,想做一个嵌套循环。

我想从 df1 迭代每一行并选择 col1 (id) 和 col2。

然后,它将获取 ID 并遍历 df2 并检查该行是否具有相同的 ID,然后将 df1 中的日期列与 df2 中的日期列进行比较

如果 df1 中的 col2 小于 df2 中的 col2,它将返回 True 并将其附加到 df1 的行。

基本上我想做的是,或者,如果有更快的方法

for(row : df1)
    for(row : df2)
        if (df1.row[col1] == df2.row[col1])
            if(df1.row[col2] < df2.row[col2])
                return df1.row[col3] == True
             else
                row[col3] == False


df1
col1     col2          col3      col4
01       01/01/2018     S         True
02       11/21/2018     F         False
03       04/03/2018     C         True

df2
col1    col2           col3
01      10/01/2018       A
02      01/01/2018       A
02      01/31/2018       F
02      10/01/2018       D
02      09/01/2018       V
03      02/01/2018       W
03      07/01/2018       X

【问题讨论】:

if col2 in df1 is less than col3 in df2, 你如何比较日期和字符? 抱歉打错了。我正在尝试比较日期。但是我会指定要比较的日期列。 你为什么不加入表格? 【参考方案1】:

pandas.merge_asof

首先,要让merge_asof 工作,您需要按日期排序

df1.sort_values(['col2', 'col1'], inplace=True)
df2.sort_values(['col2', 'col1'], inplace=True)

现在我们可以合并了

pd.merge_asof(
    df1, df2.rename(columns='col3': 'col4'),
    on='col2', by='col1', direction='forward'
).assign(col4=lambda d: d.col4.notna())

   col1       col2 col3   col4
0     1 2018-01-01    S   True
1     3 2018-04-03    C   True
2     2 2018-11-21    F  False

【讨论】:

Anaconda3\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame ---------- - 当我尝试排序时出现此错误 @VuLe 您的数据框是其他数据框的视图。而不是 inplace 参数,将其删除,然后将排序重新分配给相同的名称。

以上是关于如何基于相同的 ID 比较两个不同数据框中的日期列的主要内容,如果未能解决你的问题,请参考以下文章

使用 pandas 连接两个数据框中的不同列(并附加相似的列)

从值不同的两个数据框中获取列

检查日期是不是在另一个数据框中的两个日期之间,如果是则操作日期

如何基于一个数据框中的一列和第二个数据框中的两列合并两个数据框

比较两个不同列中相同字段的值

如何获取和比较pyspark中两个数据框中相似列的所有值的数据类型