首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >提取大于指定大小的连续值分组

提取大于指定大小的连续值分组
EN

Stack Overflow用户
提问于 2019-01-03 01:07:14
回答 3查看 56关注 0票数 2

我尝试在数据帧中查找是否至少有X个连续操作(我已经包含了一个列"Filter_OK“,用于计算该行是否满足条件),并提取该组行。

代码语言:javascript
复制
      TRN     TRN_DATE          FILTER_OK  
0   5153    04/04/2017 11:40:00      True
1   7542    04/04/2017 17:18:00      True
2   875     04/04/2017 20:08:00      True
3   74      05/04/2017 20:30:00     False
4   9652    06/04/2017 20:32:00      True
5   965     07/04/2017 12:52:00      True
6   752     10/04/2017 17:40:00      True
7   9541    10/04/2017 19:29:00      True
8   7452    11/04/2017 12:20:00      True
9   9651    12/04/2017 13:57:00     False

在本例中,如果我要查找4个操作。

所需输出:

代码语言:javascript
复制
    TRN     TRN_DATE    FILTER_OK  
4   9652    06/04/2017  20:32:00    True 
5   965     07/04/2017  12:52:00    True
6   752     10/04/2017  17:40:00    True
7   9541    10/04/2017  19:29:00    True
8   7452    11/04/2017  12:20:00    True

如何设置所需操作的子集?

EN

回答 3

Stack Overflow用户

发布于 2019-01-03 01:20:17

这也将考虑4个连续的False

代码语言:javascript
复制
s=df.FILTER_OK.astype(int).diff().ne(0).cumsum()
df[s.isin(s.value_counts().loc[lambda x : x>4].index)]
Out[784]: 
    TRN            TRN_DATE  FILTER_OK
4  9652  06/04/201720:32:00       True
5   965  07/04/201712:52:00       True
6   752  10/04/201717:40:00       True
7  9541  10/04/201719:29:00       True
8  7452  11/04/201712:20:00       True
票数 1
EN

Stack Overflow用户

发布于 2019-01-03 03:00:10

一种可能的选择是使用在源df.values上调用的itertools.groupby

pd.groupby相比,这种方法的一个重要区别是,如果分组键发生变化,则会创建一个新组。

因此,您可以尝试以下代码:

代码语言:javascript
复制
import pandas as pd
import itertools

# Source DataFrame
df = pd.DataFrame(data=[
    [ 5153, '04/04/2017 11:40:00', True ], [ 7542, '04/04/2017 17:18:00', True ],
    [  875, '04/04/2017 20:08:00', True ], [   74, '05/04/2017 20:30:00', False ],
    [ 9652, '06/04/2017 20:32:00', True ], [  965, '07/04/2017 12:52:00', True ],
    [  752, '10/04/2017 17:40:00', True ], [ 9541, '10/04/2017 19:29:00', True ],
    [ 7452, '11/04/2017 12:20:00', True ], [ 9651, '12/04/2017 13:57:00', False ]],
    columns=[ 'TRN', 'TRN_DATE', 'FILTER_OK' ])
# Work list 
xx = []
# Collect groups for 'True' key with at least 5 members
for key, group in itertools.groupby(df.values, lambda x: x[2]):
    lst = list(group)
    if key and len(lst) >= 5:
        xx.extend(lst)
# Create result DataFrame with the same column names
df2 = pd.DataFrame(data=xx, columns=df.columns)
票数 0
EN

Stack Overflow用户

发布于 2019-05-30 07:02:45

这实际上是"group by“操作的一部分(按CRD列)。如果有两个连续的行组(Crd 111和333),并且第二组行不满足条件(不是4个连续的True),则包括该组的第一行(粗体行),而不应包括该组的第一行

代码语言:javascript
复制
CRD     TRN     TRN_DATE            FILTER_OK

0    111    5153    04/04/2017 11:40:00     True

1       111     7542    04/04/2017 17:18:00     True

2       256     875     04/04/2017 20:08:00     True

3       365     74      05/04/2017 20:30:00     False

4       111     9652    06/04/2017 20:32:00     True

5       111     965     07/04/2017 12:52:00     True

6       111     752     10/04/2017 17:40:00     True

7       111     9541    10/04/2017 19:29:00     True

**8     333     7452    11/04/2017 12:20:00     True**

9       333     9651    12/04/2017 13:57:00     False

10      333     961     12/04/2017 13:57:00     False

11      333     871     12/04/2017 13:57:00     False

Actual output:

    CRD  TRN     TRN_DATE          FILTER_OK  
4   111  9652    06/04/2017 20:32:00      True

5   111  965     07/04/2017 12:52:00      True

6   111  752     10/04/2017 17:40:00      True

7   111  9541    10/04/2017 19:29:00      True

**8   333  7452    11/04/2017 12:20:00      True**

Desired output:

    CRD  TRN     TRN_DATE          FILTER_OK  
4   111  9652    06/04/2017 20:32:00      True

5   111  965     07/04/2017 12:52:00      True

6   111  752     10/04/2017 17:40:00      True

7   111  9541    10/04/2017 19:29:00      True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54010386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档