3

Pandas 或其他 python 包中是否有任何工具可以方便在 Pandas 的 dataFrame 中标记不同数量的行组?这里有更多细节:

我的 dataFrame 有一列 datetime.datetime 对象用作 dataFrame 索引。时间间隔不均匀,并且在给定的时间内,行数会发生变化。

在该数据帧中,我需要为跨越恒定时间跨度(在我的情况下为 12 秒)的每一系列行创建一个具有不同标签的列。

例如,使用带有秒数的示例

Time(s) | label
1           |   0
2           |   0
3           |   0
7           |   0
12         |   1
15         |   1
20         |   1
24          |   2 
Etc… 

我正在寻找一种替代方案作为蛮力循环。与之有些相关的算法是标签、分割、映射,但我不确定要寻找什么。我希望会有一些东西以更有效的方式利用 python、Pandas 和/或 Numpy,因为行数将达到一亿左右。

谢谢

4

2 回答 2

4

演示:

样本 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
于 2017-11-15T22:16:57.797 回答
0

IIUC,而 Time(s) 是一个整数 dtype,那么我认为你需要的是 floordiv。

df['label'] = df['Time(s)'] // 12
于 2017-11-15T22:20:06.580 回答