【问题标题】:Python dataframe group labelingPython数据框组标签
【发布时间】:2018-04-29 07:33:48
【问题描述】:

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 和/或 Numpy,因为行数将达到一亿。

谢谢

【问题讨论】:

    标签: python pandas segment labeling


    【解决方案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
    

    【讨论】:

    • freq 选项不是假定每个 12 秒的块的条目数是恒定的吗?您的示例满足了这一点,因为它是以给定的频率生成的,但正如我所描述的,在我的情况下,跨越 12 秒的给定块不会跨越恒定数量的行,因为这 12 秒是随机采样的。在那种情况下也可以吗?
    • 知道如果将“时间”列设置为数据帧的索引,为什么它不起作用?在那种情况下,我有pd.Grouper(key='index', freq='12S')。这导致:TypeError: unhashable type: 'DatetimeIndex'
    • @Wall-E,如果Time被设置为索引,使用:df.groupby(pd.Grouper(freq='12S')).ngroup()
    【解决方案2】:

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

    df['label'] = df['Time(s)'] // 12
    

    【讨论】:

      猜你喜欢
      • 2018-01-22
      • 2019-04-27
      • 2020-10-05
      • 2017-09-20
      • 2020-01-11
      • 2019-09-15
      • 1970-01-01
      • 2013-07-30
      • 2020-08-16
      相关资源
      最近更新 更多