代码之家  ›  专栏  ›  技术社区  ›  raul ferreira

顺序导线测量中的pandas groupby操作

  •  1
  • raul ferreira  · 技术社区  · 8 年前

    通过顺序遍历数据并在每次验证特定条件时创建新组来对数据帧进行分组的正确方式是什么。

    例如:

    time = [
        pd.Timestamp('20130101 09:00:00'),
        pd.Timestamp('20130101 09:00:02'),
        pd.Timestamp('20130101 09:00:03'),
        pd.Timestamp('20130101 09:01:05'),
        pd.Timestamp('20130101 09:01:06'),
        pd.Timestamp('20130101 09:01:07'),
        pd.Timestamp('20130101 09:01:13'),
        pd.Timestamp('20130101 09:01:15'),
        pd.Timestamp('20130101 09:02:10'),
        pd.Timestamp('20130101 09:03:40'),
        pd.Timestamp('20130101 09:04:15')
    ]
    
    df = pd.DataFrame({'B': [0, 1, 2, None, 4]}, time)
    
    B
    2013-01-01 09:00:00 0.0
    2013-01-01 09:00:02 1.0
    2013-01-01 09:00:03 2.0
    2013-01-01 09:01:05 NaN
    2013-01-01 09:01:06 4.0
    2013-01-01 09:01:07 5.0
    2013-01-01 09:01:13 6.0
    2013-01-01 09:01:15 7.0
    2013-01-01 09:02:10 8.0
    2013-01-01 09:03:40 4.0
    2013-01-01 09:04:15 1.0
    

    如何对上述数据进行分组,每次一行的时间戳至少比前一行早一个小时,就创建一个新组。

    所需输出:

    G1
    20130101 09:00:00
    20130101 09:00:02
    20130101 09:00:03
    
    G2
    20130101 09:01:05
    20130101 09:01:06
    20130101 09:01:07
    20130101 09:01:13
    20130101 09:01:15
    20130101 09:02:10
    
    G3
    20130101 09:03:40
    20130101 09:04:15
    

    我可以用命令式的方式来实现这一点,我想知道pandas API是否可以自然地表达这种类型的操作。

    1 回复  |  直到 8 年前
        1
  •  1
  •   gereleth    8 年前

    我想你的意思是相隔一分钟,而不是一小时,所以这里有一个可能的解决方案。可以按如下方式计算要分组的变量:

    • 将索引转换为系列,并使用 diff
    • 将这些值与所需的时间增量(1小时或1分钟)进行比较
    • 计算比较结果的累积和。这样,每次出现较大的时间差距时,价值都会增加一倍。
    • 按结果列对数据帧进行分组。

    下面是一个示例:

    # using the time list provided in question
    df = pd.DataFrame({'B': list(range(11))}, time) 
    g = (df.index.to_series().diff()>pd.to_timedelta('1m')).cumsum()
    for i, group in df.groupby(g):
        print(group)
    
                         B
    2013-01-01 09:00:00  0
    2013-01-01 09:00:02  1
    2013-01-01 09:00:03  2
                         B
    2013-01-01 09:01:05  3
    2013-01-01 09:01:06  4
    2013-01-01 09:01:07  5
    2013-01-01 09:01:13  6
    2013-01-01 09:01:15  7
    2013-01-01 09:02:10  8
                          B
    2013-01-01 09:03:40   9
    2013-01-01 09:04:15  10