Python 数据框组标签
Python dataframe group labeling
Pandas 或其他 python 包中是否有任何工具可以帮助标记 Pandas 数据帧中不同行数的组?这里有更多细节:
我的 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 and/or Numpy,因为行数将达到一亿的数量级。
谢谢
演示:
样本 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,Time(s) 是一个整型数据类型,那么我想你需要的是floordiv。
df['label'] = df['Time(s)'] // 12
Pandas 或其他 python 包中是否有任何工具可以帮助标记 Pandas 数据帧中不同行数的组?这里有更多细节:
我的 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 and/or Numpy,因为行数将达到一亿的数量级。
谢谢
演示:
样本 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,Time(s) 是一个整型数据类型,那么我想你需要的是floordiv。
df['label'] = df['Time(s)'] // 12