我有一个看起来像这样的数据框:
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
答案 0 :(得分:1)
由于您的状况“连续三年保持平稳”,因此您实际上不需要差异,只需要检查任何三年滚动窗口中的第一年是否等于第三年,或者可以轻松地进行检查pandas
是max() == 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