按组过滤,其中熊猫系列值增加

时间:2020-07-27 13:40:10

标签: 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],
                   '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”列中的所有组,其中“ amt”列中的值逐年增加,或者“平坦”(不增加/不减少),最多2年。

我的结果应如下所示:

        a  result
0   cust1  True
1   cust2  True
2   cust3  False    

逻辑:

cust1 = amt每年递增

cust2 =每年增加幅度,或系列中连续2年保持不变

cust3 = amt连续三年或以上(2017、2018、2019)持平

我知道如何检查从下一年到下一年的增长,但是正在努力使连续两年最多没有增长的附加条件。

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

1 个答案:

答案 0 :(得分:1)

由于您的状况“连续三年保持平稳”,因此您实际上不需要差异,只需要检查任何三年滚动窗口中的第一年是否等于第三年,或者可以轻松地进行检查pandasmax() == min()在任何窗口中。

您可以使用.rolling(3),如下所示:

window3 = df.sort_values('year').groupby('a')['amt'].rolling(3)
cust_needs_filter = (window3.max() == window3.min()).groupby('a').any()
result_df = (~cust_needs_filter).to_frame().rename(columns={"amt": "result"}).reset_index()

print(result_df)

输出:

       a  result
0  cust1    True
1  cust2    True
2  cust3   False