我有以下数据框:
Out[56]:
input on_time
0 2 1.1
1 4 2.2
2 8 3.4
3 5 3.5
4 6 6.2
5 11 8.4
6 13 8.4
on_time是我实际代码中的时间戳。我想将具有on_time值彼此接近(在彼此的可配置范围内)的输入分组,并将它们添加到数据帧(on_time值是两者中的最高者)。这将导致以下数据帧:
Out[60]:
input on_time
0 2 1.1
1 4 2.2
2 8 3.4
3 5 3.5
4 6 6.2
5 11 8.4
6 13 8.4
7 8/5 3.5
8 11/13 8.4
我认为我可以通过一些迭代和循环来做到这一点,但是有几种方法可以做到这一点?
答案 0 :(得分:0)
sort
值,然后定义一些差异阈值,在此阈值以下将值分组。汇总列,以便我们加入“输入”,选择on_time列的最大值,并计算size
,以便我们可以将子集仅包含具有多个值的组。最后concat
的结果。
thresh = 0.2
df = df.sort_values('on_time')
grps = df['on_time'].diff().gt(0.2).cumsum()
res = (df.groupby(grps).agg(input=('input', lambda x: '/'.join(x.dropna().astype(str)), ),
on_time=('on_time', 'max'),
size=('on_time', 'size'))
.query('size >= 2')
.drop(columns='size'))
pd.concat([df, res], ignore_index=True)
# input on_time
#0 2 1.1
#1 4 2.2
#2 8 3.4
#3 5 3.5
#4 6 6.2
#5 11 8.4
#6 13 8.4
#7 8/5 3.5
#8 11/13 8.4