首页 > 解决方案 > 有没有更快的方法来查找数据框中的常量值范围?

问题描述

我想找到数据框中常量值的最长持续时间。例如,给定下面的数据框,最长持续时间应为 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 分钟。

标签: pythonpandasdataframedatetime

解决方案


groupby+nlargest

创建一个跟踪更改的分组系列。

groupr = df.value.ne(df.value.shift()).cumsum()

创建一个映射字典,可以将groupr键转换为列中的实际valuedf.value

mapper = dict(zip(groupr, df.value))

现在我们分组并使用ptpand nlargest。最后,我们使用renameandmapperindex值(即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是最长的持续时间。

参考

np.ptp
最大


推荐阅读