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伟大的对我的答案进行了必要的修改以获得准确的结果。