我有一个数据集,看起来像这样:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十九|20180527|
| 1| 17个|20180223|
| 1| 17个|20180223|
| 1| 17个|20180223|
| 1|三十|20120612|
| 1|十四岁|20120214|
| 二|四十|20210605|
| 二|三十二|20210412|
| 二|二十五|20210315|
| 三|三十九|20170504|
| 三|17个|2017年02月05日|
| 三|四十|20150506|
正如你所看到的,最高的代码有最高的日期。我想提取那些代码和日期。有些人在重复。例如,在id 1中,最高的代码是39和30,我想获得这些代码和与它们相关联的日期。这里要注意的一件事是,最高代码日期的值之间有一年的间隔。上述数据集的输出应为:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十九|20180527|
| 1|三十|20120612|
| 二|四十|20210605|
| 三|三十九|20170504|
| 三|四十|20150506|
我尝试使用下面的代码,但它只给我最高的值,并没有考虑重复的值。
latest_dates = column_selection.groupby("id").max() # group the data by id and get the max date for each group
latest_dates = latest_dates.reset_index() # reset the index
latest_dates # print the latest date for each ID with the new index
这是我使用上面的代码得到的输出:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 1|三十九|20180527|
| 二|四十|20210605|
| 三|三十九|20170504|
我将非常感谢任何帮助。
1条答案
按热度按时间bqjvbblv1#
使用
.nlargest(2)
和.loc
过滤索引值。另一种方法是将
.sort_values
和.cumcount
与布尔过滤器一起使用。编辑-处理年份差异。
获得 Dataframe 后,我们可以将
date
字段转换为正确的日期,并在对date
字段排序后在id
级别应用diff
然后,您可以创建一个辅助密钥来删除它们之间相差不到一年的值。
再深入一点,我们需要两个条件来过滤。
1.任何具有
less
的值,而不是它们之间的year
增量。1.取两者中较高的一个。