pandas groupby以顺序遍历操作

时间:2018-01-23 17:54:49

标签: python pandas

通过顺序遍历数据并在每次验证某个条件时创建新组,对pandas数据帧进行分组的正确方法是什么。

例如:

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 个答案:

答案 0 :(得分:1)

我假设你的意思是一分钟而不是一个小时,所以这里有一个可能的解决方案。您可以像这样计算要分组的变量:

  • 将索引转换为系列,并使用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