我有一只大熊猫DataFrame
,其定义如下:
# -*- coding: utf-8 -*-
import datetime as dt
import pandas as pd
data = [[1, 1], [1, 1], [2, 2], [2, 2], [2, 2], [3, 3], [4, 4], [4, 4],
[4, 4], [5, 5], [5, 5]]
df = pd.DataFrame(data, columns=['A', 'B'])
df.index = pd.date_range(dt.datetime(2012, 1, 1), periods=len(df), freq='H')
print(df)
和产量:
A B
2012-01-01 00:00:00 1 1
2012-01-01 01:00:00 1 1
2012-01-01 02:00:00 2 2
2012-01-01 03:00:00 2 2
2012-01-01 04:00:00 2 2
2012-01-01 05:00:00 3 3
2012-01-01 06:00:00 4 4
2012-01-01 07:00:00 4 4
2012-01-01 08:00:00 4 4
2012-01-01 09:00:00 5 5
2012-01-01 10:00:00 5 5
现在我试图获取A列和B列相等的行的索引并且至少(或者确切地说也足够)n A
中的n个连续行(此处为小时数)相等和B
即我想提取必须连续的索引值(长度> = n的切片)A
和B
相等。
所以在这种情况下,对于n = 2,它应该是" twos"的索引。和"四个":
2012-01-01 02:00:00
2012-01-01 03:00:00
2012-01-01 04:00:00
2012-01-01 06:00:00
2012-01-01 07:00:00
2012-01-01 08:00:00
仅获取A
和B
相等的行的索引非常简单。
但是如何才能获取n个连续的相等元素?
我想一定有一些我目前看不到的奇特的组合方式......
答案 0 :(得分:3)
根据您的描述,我不清楚为什么1& 5将从您的结果中排除,因为它们每个都包含2个或更多连续行,并且A&乙
但是,下面的解决方案仍然有用,我确信您可以根据自己的需要对其进行修改。它首先过滤数据框,以匹配列A
和B
(df_matching
)中的值。然后,它使用 shift-cumsum 模式对连续匹配的值进行分组,然后对n
进行过滤。
n = 2
df_matching = df[df.A == df.B]
gb = df_matching.groupby((df_matching.A != df_matching.A.shift()).cumsum())
df_target = gb.filter(lambda x: len(x) >= n)
>>> df_target
A B
2012-01-01 00:00:00 1 1
2012-01-01 01:00:00 1 1
2012-01-01 02:00:00 2 2
2012-01-01 03:00:00 2 2
2012-01-01 04:00:00 2 2
2012-01-01 06:00:00 4 4
2012-01-01 07:00:00 4 4
2012-01-01 08:00:00 4 4
2012-01-01 09:00:00 5 5
2012-01-01 10:00:00 5 5
上面的数据框是为了确保它符合您的期望。然后只提取索引:
>>> df_target.index
DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 01:00:00',
'2012-01-01 02:00:00', '2012-01-01 03:00:00',
'2012-01-01 04:00:00', '2012-01-01 06:00:00',
'2012-01-01 07:00:00', '2012-01-01 08:00:00',
'2012-01-01 09:00:00', '2012-01-01 10:00:00'],
dtype='datetime64[ns]', freq=None)
请注意,如果n=3
,则会获得预期结果。