【问题标题】:Python: Add conditional column in dataframe - if date lies in any of the multiple periods defined in another dataframePython:在数据框中添加条件列 - 如果日期位于另一个数据框中定义的多个期间中的任何一个
【发布时间】:2020-03-18 14:54:59
【问题描述】:

我有一个 df1:

我还有另一个 df2:

我想在 df1 Flag 中添加另一列:

  • 1 如果该作业的时间戳位于针对该作业在 df2 中定义的任何时间段内(在 df2 中的 4 个作业名中的任何一个中)。
  • 否则为 0。

我尽量说清楚。

我已经使用 iterrows 对 df1 行进行了迭代,但我们都知道这不是正确/有效的方法。

我正在寻找一个矢量化的操作来达到同样的效果!!

【问题讨论】:

  • 欢迎来到 S/O。请发布一个最低限度可重现的代码示例,以便我们为您提供帮助。此外,请不要包含数据的图片。只需创建一个最小的数据示例。

标签: python pandas dataframe vectorization data-science


【解决方案1】:

我假设您的 DataFrame 中的 TimeStampStartTimeEndTime 列 属于 datetime 类型(不是 string)。

首先将 df2 重新格式化为 df3,方法如下:

df3 = df2.set_index(['Key', 'StartTime', 'EndTime']).stack()\
    .replace('', np.nan).dropna().reset_index(level=[0,3], drop=True)\
    .rename('JobName').reset_index()

对于我的示例数据(df2 的前几行),结果是:

            StartTime             EndTime JobName
0 2019-04-20 12:30:00 2019-04-20 13:20:00       A
1 2019-04-20 12:30:00 2019-04-20 13:20:00       S
2 2019-04-16 12:30:00 2019-04-21 13:20:00       B
3 2019-04-17 12:30:00 2019-04-22 13:20:00       C
4 2019-04-17 12:30:00 2019-04-22 13:20:00       A
5 2019-04-17 12:30:00 2019-04-22 13:20:00       G

然后定义如下函数,返回Flagdf1 中的当前

def getFlag(row):
    return 1 if any(df3.JobName.eq(row.JobName) & df3.StartTime.le(row.TimeStamp)
        & df3.EndTime.ge(row.TimeStamp)) else 0

最后一步是应用此函数并将结果保存在新列中:

df1['Flag'] = df1.apply(getFlag, axis=1)

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 2022-10-23
    • 2020-04-11
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2021-07-25
    相关资源
    最近更新 更多