python - 如果特定行的最大日期时间在最小值 - 数据帧中其余行的最大日期时间范围内,则创建一个计数器
问题描述
这是我的输入数据框。数据框:
# 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
请帮助我
解决方案
您可以通过检查日期时间对象是否在两列日期时间对象之间来按日期过滤数据框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 |
推荐阅读
- javascript - 无法读取 null 的属性“beginPath”
- c# - 如何将 UpdateSourceTrigger 的值移交给 UserControl 或在运行时更新?
- php - 返回期间具有关系的变量发生变化
- c - 我的数组的第一个元素来自哪里,它是什么?
- javascript - 外部脚本中的全局 polyfill 破坏网站功能的风险是什么?
- keyboard - 从 kivy 的 on_touch_down 检查按下的键盘键
- sql-server - t-sql 中 COUNT() 的返回类型是什么?
- javascript - 尝试在 Javascript 中使用 gremlin 连接到 Cosmos DB 时出现服务器超时
- regex - 扫描文本文件以查找具有特定字符的单词
- android - 我们应该如何处理由于离线 p2p 安装而导致的 Android App Bundle Resources$NotFoundException 崩溃?