2017-06-28 58 views
3

我有一個熊貓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個連續行(這裏小時)在AB中相等,即,我想提取必須連續的索引值(切片長度> = n),其中AB相等。

因此,在這種情況下,對於n = 2應該爲「兩歲」和「四肢」的索引:

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 

獲取只爲AB相等是直截了當的行的索引。

但是我怎樣才能獲取只有n個連續的相等元素?

我想肯定會有一些花哨GROUPBY辦法,我沒有看到目前..

+1

爲什麼在你給的例子中不會輸出「one」和「five」的索引? –

+0

因爲只有兩行相等的「五」和n = 2所以只有三行相同的數字被返回 –

+0

仍然不清楚爲什麼1和5不包括在返回的集合中。兩者都是n = 2連續行的例子,其中A和B相等。 – Alexander

回答

3

根據您的描述,我不明白爲什麼1 & 5會從結果中排除,因爲它們每一個都包含2個或更多連續的行,具有匹配的值A & B.

但是,下面的解決方案仍應該有所幫助,我相信您可以對其進行修改以滿足您的需求。它首先篩選數據幀以匹配ABdf_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預期的結果。

+0

這可以工作,但我在'df_target'的第一個和最後一個條目中有一些連續的相等元素

+0

我又試了一次。它與我在這裏提供的示例數據框一起工作,但與我的真實數據(包含浮點值)無關。 –

+0

我會嘗試並稍後報告.. –

相關問題