Python数据帧组标记
Pandas或其他python包中是否有任何工具可以方便地标记Pandas数据帧中不同行数的组?以下是更多细节: 我的dataFrame有一列datetime.datetime对象用作dataFrame索引。时间间隔不均匀,在给定的时间内,行数会有所不同 在该数据帧中,我需要创建一个列,该列对于跨越固定时间跨度(在我的示例中为12秒)的每一系列行具有不同的标签 例如,使用带有秒的示例Python数据帧组标记,python,pandas,segment,labeling,Python,Pandas,Segment,Labeling,Pandas或其他python包中是否有任何工具可以方便地标记Pandas数据帧中不同行数的组?以下是更多细节: 我的dataFrame有一列datetime.datetime对象用作dataFrame索引。时间间隔不均匀,在给定的时间内,行数会有所不同 在该数据帧中,我需要创建一个列,该列对于跨越固定时间跨度(在我的示例中为12秒)的每一系列行具有不同的标签 例如,使用带有秒的示例 Time(s) | label 1 | 0 2 | 0 3
Time(s) | label
1 | 0
2 | 0
3 | 0
7 | 0
12 | 1
15 | 1
20 | 1
24 | 2
Etc…
我正在寻找一种替代方法作为蛮力循环。与此相关的算法有标记、分割和映射,但我不确定到底要寻找什么。我希望有一些东西能更有效地利用python、Pandas和/或Numpy,因为行数将达到1亿左右
谢谢演示:
样本DF:
In [32]: df = pd.DataFrame({'Time':pd.date_range('2017-01-01 00:00:01', freq='3S', periods=15)})
In [33]: df
Out[33]:
Time
0 2017-01-01 00:00:01
1 2017-01-01 00:00:04
2 2017-01-01 00:00:07
3 2017-01-01 00:00:10
4 2017-01-01 00:00:13
5 2017-01-01 00:00:16
6 2017-01-01 00:00:19
7 2017-01-01 00:00:22
8 2017-01-01 00:00:25
9 2017-01-01 00:00:28
10 2017-01-01 00:00:31
11 2017-01-01 00:00:34
12 2017-01-01 00:00:37
13 2017-01-01 00:00:40
14 2017-01-01 00:00:43
解决方案:
In [34]: df['label'] = df.groupby(pd.Grouper(key='Time', freq='12S')).ngroup()
结果:
In [35]: df
Out[35]:
Time label
0 2017-01-01 00:00:01 0
1 2017-01-01 00:00:04 0
2 2017-01-01 00:00:07 0
3 2017-01-01 00:00:10 0
4 2017-01-01 00:00:13 1
5 2017-01-01 00:00:16 1
6 2017-01-01 00:00:19 1
7 2017-01-01 00:00:22 1
8 2017-01-01 00:00:25 2
9 2017-01-01 00:00:28 2
10 2017-01-01 00:00:31 2
11 2017-01-01 00:00:34 2
12 2017-01-01 00:00:37 3
13 2017-01-01 00:00:40 3
14 2017-01-01 00:00:43 3
IIUC,时间是一个整数,那么我想你需要的是floordiv
df['label'] = df['Time(s)'] // 12
freq选项不是假设每个12秒的块中有恒定数量的条目吗?您的示例满足了这一点,因为它是以给定的频率生成的,但正如我所描述的,在我的示例中,跨越12s的给定块不会跨越恒定数量的行,因为这些12s是随机采样的。在这种情况下也会这样吗?你知道如果“Time”列被设置为数据帧的索引,为什么它不起作用吗?在这种情况下,我有了pd.gropper(key='index',freq='12S')。这将导致:
TypeError:unhabable type:'DatetimeIndex'
@Wall-E,如果Time
设置为索引,请使用:df.groupby(pd.Grouper(freq='12S')).ngroup()