通过顺序遍历数据并在每次验证某个条件时创建新组,对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是否可以自然地表达这种类型的操作。
答案 0 :(得分:1)
我假设你的意思是一分钟而不是一个小时,所以这里有一个可能的解决方案。您可以像这样计算要分组的变量:
diff
以下是一个例子:
# 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