微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-Pandas DataFrame:查找两列相等/相同的特定长度序列的索引值

我有一个熊猫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列相等且至少(或恰好也足够)A和B中n个连续行(此处为小时)相等的行的索引,即我想提取索引值在A和B相等的情况下,它们必须是连续的(长度大于等于= n的切片).

因此,在这种情况下,对于n = 2,它应该是“ twos”和“ fours”的索引:

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个连续的相等元素?

我想肯定有一些我目前看不到的花哨的groupby方法.

解决方法:

根据您的描述,我不清楚为什么1& 1.结果中将排除5个,因为它们每个都包含2个或多个连续的行,且A和A的值匹配. B.

但是,下面的解决方案仍然应该会有所帮助,并且我确定您可以对其进行修改以适合您的需求.它首先过滤数据帧以匹配A列和B列中的值(df_matching).然后,它使用移位累加模式将连续的匹配值分组,然后对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,您将获得预期的结果.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐