首页 > 解决方案 > 如果特定行的最大日期时间在最小值 - 数据帧中其余行的最大日期时间范围内,则创建一个计数器

问题描述

这是我的输入数据框。数据框:

# intialise data of lists.
df = {'eqmt_id':[1, 1,1,2,2],
        'brand_no':['BH40 122', 'BH40 200', 'BH40 541', 'BH40 619', 'BH40 649'],
       'ndt':['2021-03-28 05:10:00', '2021-04-25 20:31:00','2020-09-13 11:33:00', '2020-11-08 22:53:00','2020-12-02 04:46:00'],
       'min':['2021-03-28 05:30:00','2021-04-25 21:00:00','2020-09-13 12:00:00','2020-11-08 23:00:00','2020-11-17 05:00:00'],
       'max':['2021-04-06 08:00:00','2021-05-03 18:30:00','2020-09-23 12:30:00','2020-11-18 10:30:00','2020-12-09 18:00:00']}
  
# Create DataFrame
df = pd.DataFrame(df)
#to date time
df['ndt'] = pd.to_datetime(df['ndt'])
df['min'] = pd.to_datetime(df['min'])
df['max'] = pd.to_datetime(df['max'])
# Print the output.
df

在这里,我想创建一个计数器,以便了解在哪一行有重叠。所以过程是,我们必须遍历每一行并与其余行进行比较。

假设第一行(品牌:BH40 122),这里我们必须取最大值,然后我们必须将它与其余所有数据帧行进行比较,如果 BH40 122 的最大值落在任何一行中,即其他品牌_no,则计数器=计数器+ 1。第二行将再次运行并检查数据框中的其余行,然后更新计数器。

eqmt_id 品牌号 无损检测 分钟 最大限度
1 BH40 122 2021-03-28 05:10:00 2021-03-28 05:30:00 2021-04-06 08:00:00
1 BH40 200 2021-04-25 20:31:00 2021-04-25 21:00:00 2021-05-03 18:30:00
1 BH40 541 2020-09-13 11:33:00 2020-09-13 12:00:00 2020-09-23 12:30:00
2 BH40 619 2020-11-08 22:53:00 2020-11-08 23:00:00 2020-11-18 10:30:00
2 BH40 649 2020-12-02 04:46:00 2020-11-17 05:00:00 2020-12-09 18:00:00

这是我的最终结果

eqmt_id 品牌号 无损检测 分钟 最大限度 柜台
1 BH40 122 2021-03-28 05:10:00 2021-03-28 05:30:00 2021-04-06 08:00:00 0
1 BH40 200 2021-04-25 20:31:00 2021-04-25 21:00:00 2021-05-03 18:30:00 0
1 BH40 541 2020-09-13 11:33:00 2020-09-13 12:00:00 2020-09-23 12:30:00 0
2 BH40 619 2020-11-08 22:53:00 2020-11-08 23:00:00 2020-11-18 10:30:00 1
2 BH40 649 2020-12-02 04:46:00 2020-11-17 05:00:00 2020-12-09 18:00:00 0

如我们所见,如果我们用 rest 迭代 BH40 619(第 4 行),我们会发现 BH40 619(第 4 行)的最大值落在 BH40 649(最后一行)的最小值和最大值中,所以 counter = 1。我的数据集是最后一个,如果我们会看到计数器并上升到 4-5,可能会有多种情况。

我正在尝试但不知道如何完成:(

for index, row in df.iterrows():
    counter = 0
    max_date = row['max']
    brand_no = row['brand_no']
    
    #skipping the iterative row (above one)
    ndf = df[df['brand_no'] != brand_no]
    
    #Iterating for rest
    for index1, row1 in ndf.iterrows():
        if(max_date > row1['min'] and max_date< row1['max']):
            row['counter'] = counter+1

请帮助我

标签: pythonpandas

解决方案


您可以通过检查日期时间对象是否在两列日期时间对象之间来按日期过滤数据框df[(df['min'] <= date) & (df['max'] >= date)]:在您的情况下,它将始终返回至少 1 行,这是您正在max处理其值的行。因此,我们必须在将其放入时从过滤后的数据帧的长度中减去 1 df.apply

df['counter'] = df['max'].apply(lambda x: len(df[(df['min'] <= x) & (df['max'] >= x)]) - 1)

输出:

eqmt_id 品牌号 无损检测 分钟 最大限度 柜台
0 1 BH40 122 2021-03-28 05:10:00 2021-03-28 05:30:00 2021-04-06 08:00:00 0
1 1 BH40 200 2021-04-25 20:31:00 2021-04-25 21:00:00 2021-05-03 18:30:00 0
2 1 BH40 541 2020-09-13 11:33:00 2020-09-13 12:00:00 2020-09-23 12:30:00 0
3 2 BH40 619 2020-11-08 22:53:00 2020-11-08 23:00:00 2020-11-18 10:30:00 1
4 2 BH40 649 2020-12-02 04:46:00 2020-11-17 05:00:00 2020-12-09 18:00:00 0

推荐阅读