我有一个具有以下结构的 Pandas 数据框
id date num
243 2014-12-01 3
234 2014-12-01 2
243 2015-12-01 2
234 2016-12-01 4
243 2016-12-01 6
234 2017-12-01 5
243 2018-12-01 7
234 2018-12-01 10
243 2019-12-01 1
234 2019-12-01 12
243 2020-12-01 15
234 2020-12-01 5
我想添加另一列来比较字段 编号 来自 id 如果它小于前几年的任何值(对于每个 id )。例如, id 243 和 日期 2019-12-01 的值为 1。在这种情况下,新字段 旗将假定为 True,因为前几年没有任何值小于 id 243. 预期的数据框应如下所示:id date num flag
243 2014-12-01 3 -
234 2014-12-01 2 -
243 2015-12-01 2 True
234 2016-12-01 4 False
243 2016-12-01 6 False
234 2017-12-01 5 False
243 2018-12-01 7 False
234 2018-12-01 10 False
243 2019-12-01 1 True
234 2019-12-01 12 False
243 2020-12-01 15 False
234 2020-12-01 5 False
我一直在寻找一个解决方案,让我可以将每一行与前几年的行进行比较。任何建议如何将每行值与几年前的值进行比较?谢谢
最佳答案
.cummin
按组获取累积最小值.cumcount
将每个组的第一个值返回为 -
与 np.where
df['flag'] = (df['num'] == df.groupby(['id'])['num'].transform('cummin'))
df['flag'] = np.where(df.groupby('id').cumcount() == 0, '-', df['flag'])
df
Out[1]:
id date num flag
0 243 2014-12-01 3 -
1 234 2014-12-01 2 -
2 243 2015-12-01 2 True
3 234 2016-12-01 4 False
4 243 2016-12-01 6 False
5 234 2017-12-01 5 False
6 243 2018-12-01 7 False
7 234 2018-12-01 10 False
8 243 2019-12-01 1 True
9 234 2019-12-01 12 False
10 243 2020-12-01 15 False
11 234 2020-12-01 5 False
小注:代替 np.where()
,您还可以使用:df['flag'] = df['flag'].where(df.groupby('id').cumcount() != 0, '-')
这基本上做完全相同的事情。在其中一行代码中:
(df.num == df.groupby('id').num.cummin()).where(df.groupby('id').cumcount() != 0, '-')
关于python - Pandas - 按组比较当前年份与所有以前年份的值,如果它是累积最小值,则返回 True,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64253445/