python - 有没有更快的方法来查找数据框中的常量值范围?
问题描述
我想找到数据框中常量值的最长持续时间。例如,给定下面的数据框,最长持续时间应为 30 分钟(当值 = 2 时)。
import pandas as pd
d = {'date_time': ['2016-01-01 12:00:00', '2016-01-01 12:15:00',
'2016-01-01 12:30:00', '2016-01-01 12:45:00',
'2016-01-01 13:00:00', '2016-01-01 13:15:00',
'2016-01-01 13:30:00', '2016-01-01 13:45:00'],
'value': [1,2,2,2,4,5,5,7]}
df = pd.DataFrame(data=d)
df['date_time'] = pd.to_datetime(df['date_time'])
print(df)
date_time value
0 2016-01-01 12:00:00 1
1 2016-01-01 12:15:00 2
2 2016-01-01 12:30:00 2
3 2016-01-01 12:45:00 2
4 2016-01-01 13:00:00 4
5 2016-01-01 13:15:00 5
6 2016-01-01 13:30:00 5
7 2016-01-01 13:45:00 7
(注意:date_time 间隔并不总是一致的。)
我设法通过查找 的索引找到它df.value.diff().abs()==0
,构建了一个复杂的函数来遍历该列表并计算范围。
由于实际的数据框比这个例子大得多,是否有快捷功能或更快的方法来获得它而无需多次迭代?
谢谢你。
编辑:
就我而言,相同的值可以出现在其他条纹中。一个更合适的例子是
d = {'date_time': ['2016-01-01 12:00:00', '2016-01-01 12:15:00',
'2016-01-01 12:30:00', '2016-01-01 12:45:00',
'2016-01-01 13:00:00', '2016-01-01 13:15:00',
'2016-01-01 13:30:00', '2016-01-01 13:45:00',
'2016-01-01 14:00:00', '2016-01-01 14:05:00'],
'value': [1,2,2,2,4,5,5,7,5,5]}
df = pd.DataFrame(data=d)
df['date_time'] = pd.to_datetime(df['date_time'])
print(df)
date_time value
0 2016-01-01 12:00:00 1
1 2016-01-01 12:15:00 2
2 2016-01-01 12:30:00 2
3 2016-01-01 12:45:00 2
4 2016-01-01 13:00:00 4
5 2016-01-01 13:15:00 5
6 2016-01-01 13:30:00 5
7 2016-01-01 13:45:00 7
8 2016-01-01 14:00:00 5
9 2016-01-01 14:05:00 5
在这种情况下,当 value = 2 时,最长持续时间仍然是 30 分钟。
解决方案
groupby
+nlargest
创建一个跟踪更改的分组系列。
groupr = df.value.ne(df.value.shift()).cumsum()
创建一个映射字典,可以将groupr
键转换为列中的实际value
值df.value
。
mapper = dict(zip(groupr, df.value))
现在我们分组并使用ptp
and nlargest
。最后,我们使用rename
andmapper
将index
值(即groupr
值)转换回value
值(呸,这有点令人困惑)。
df.groupby(groupr).date_time.apply(np.ptp).nlargest(1).rename(mapper)
value
2 0 days 00:30:00
Name: date_time, dtype: timedelta64[ns]
2
索引中的 是持续value
时间最长的。0 days 00:30:00
是最长的持续时间。
参考
推荐阅读
- java - Webflux-Aop:在 Aspect 类中获取方法请求(单声道)
- r - 重复列中的值
- amazon-sagemaker - Sage Maker Studio CPU 使用率
- postman - 在 Postman 中,如何选择一个特定的示例在模拟服务器中显示为端点响应?
- flutter - Flutter - 设置sidenav渐变颜色时不显示列表图块的悬停颜色(MacOS应用程序)
- r - 如何更改tmap中图例元素的顺序
- fp-ts - FP-TS 等效于 Lodash 或 Ramda `cond`?
- python - 制作一个每 40 分钟发送一次消息的机器人 Discord.py
- spring-boot - 任何人都知道为什么将 Micrometer 依赖项添加到 Spring Cloud Dataflow 任务会导致任务 pod 永远无法完成?
- javascript - 箭头函数不返回 HTML 选项标记