Python 按组筛选,其中系列中的值以大熊猫为单位增加

Python 按组筛选,其中系列中的值以大熊猫为单位增加,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个数据框,看起来像这样: pd.DataFrame({'a': ['cust1', 'cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3', 'cust3'], 'year': [2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020],

我有一个数据框,看起来像这样:

pd.DataFrame({'a': ['cust1', 'cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3', 'cust3'],
                   'year': [2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020],
                   'amt': [2, 3, 4, 5, 2, 2, 3, 3, 3, 3, 3, 5]})

        a  year  amt
0   cust1  2017    2
1   cust1  2018    3
2   cust1  2019    4
3   cust1  2020    5
4   cust2  2017    2
5   cust2  2018    2
6   cust2  2019    3
7   cust2  2020    3
8   cust3  2017    3
9   cust3  2018    3
10  cust3  2019    3
11  cust3  2020    5
        a  result
0   cust1  True
1   cust2  True
2   cust3  False    
如何筛选“a”列中的所有组,其中“金额”列中的值逐年增加或在最多2年内保持不变不增加/不减少

我的结果应该如下所示:

pd.DataFrame({'a': ['cust1', 'cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3', 'cust3'],
                   'year': [2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020],
                   'amt': [2, 3, 4, 5, 2, 2, 3, 3, 3, 3, 3, 5]})

        a  year  amt
0   cust1  2017    2
1   cust1  2018    3
2   cust1  2019    4
3   cust1  2020    5
4   cust2  2017    2
5   cust2  2018    2
6   cust2  2019    3
7   cust2  2020    3
8   cust3  2017    3
9   cust3  2018    3
10  cust3  2019    3
11  cust3  2020    5
        a  result
0   cust1  True
1   cust2  True
2   cust3  False    
逻辑:

cust1=金额每年增加

cust2=金额每年增加,或系列内最多连续两年持平

cust3=2017年、2018年、2019年连续3年或更长时间,金额持平

我知道如何检查从1年到下一年的增长情况,但我很难满足最多连续2年不增长的附加条件

df.sort_values('year').groupby('a')['amt'].pct_change() > 0

因为你的情况在3年内是平的,所以你实际上不需要差异,只需要检查在任何3年滚动窗口中第1年是否等于第3年,或者在任何窗口中最容易检查的是max==min

您可以这样使用:

pd.DataFrame({'a': ['cust1', 'cust1', 'cust1', 'cust1', 'cust2', 'cust2', 'cust2', 'cust2', 'cust3', 'cust3', 'cust3', 'cust3'],
                   'year': [2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020, 2017, 2018, 2019, 2020],
                   'amt': [2, 3, 4, 5, 2, 2, 3, 3, 3, 3, 3, 5]})

        a  year  amt
0   cust1  2017    2
1   cust1  2018    3
2   cust1  2019    4
3   cust1  2020    5
4   cust2  2017    2
5   cust2  2018    2
6   cust2  2019    3
7   cust2  2020    3
8   cust3  2017    3
9   cust3  2018    3
10  cust3  2019    3
11  cust3  2020    5
        a  result
0   cust1  True
1   cust2  True
2   cust3  False    
window3=df.sort_values'year'.groupby'a'['amt'].rolling3 cust\u需要\u filter=window3.max==window3.min.groupby'a'。任何 result_df=~cust_需要_filter.to_frame.renamecolumns={amt:result}.reset_索引 打印结果 输出:

       a  result
0  cust1    True
1  cust2    True
2  cust3   False

你的预期产量是多少?你说或者最多2年是平的,cust3不应该被过滤掉吗?或者仅仅显示其增长金额的年份?金额可以下降吗?或者仅向上/相同?尝试将.pct_change或.diff设置为一列,并使用.rolling2.agg['mean','sum'],编辑我的预期输出。产量不能下降,只能连续两年上升或保持不变。然后必须再次上升,才能连续两年保持平稳。我已经编辑了我的预期产出。我将调查了解情况。rolling@idt_tt伟大的对我的答案进行了必要的修改以获得准确的结果。