pandas 从数据集中获取重复和非重复的最高代码

fdbelqdn  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(178)

我有一个数据集,看起来像这样:
| 身份证|代码|日期|
| --------------|--------------|--------------|
| 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|
我将非常感谢任何帮助。

bqjvbblv

bqjvbblv1#

使用.nlargest(2).loc过滤索引值。

df.loc[df.groupby(['id'])['code'].nlargest(2).index.get_level_values(1)]

    id  code      date
0    1    39  20180527
4    1    30  20120612
6    2    40  20210605
7    2    32  20210412
11   3    40  20150506
9    3    39  20170504

另一种方法是将.sort_values.cumcount与布尔过滤器一起使用。

df.loc[df.sort_values('code',ascending=False).groupby('id').cumcount().le(1)]


    id  code      date
0    1    39  20180527
4    1    30  20120612
6    2    40  20210605
7    2    32  20210412
9    3    39  20170504
11   3    40  20150506

编辑-处理年份差异。

获得 Dataframe 后,我们可以将date字段转换为正确的日期,并在对date字段排序后在id级别应用diff
然后,您可以创建一个辅助密钥来删除它们之间相差不到一年的值。

import numpy as np

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

s = df.loc[df.groupby(['id'])['code'].nlargest(2).index.get_level_values(1)]

con = (s.sort_values(['id','date']
           ).groupby('id')['date'].diff() / np.timedelta64(1,'Y')).fillna(1)

s['grp'] = s.groupby(['id', con.lt(1)]).cumcount()

out = s.sort_values(['id', 'code']).drop_duplicates(subset=['id', 'grp'],keep='last').drop('grp',axis=1)

    id  code       date
4    1    30 2012-06-12
0    1    39 2018-05-27
6    2    40 2021-06-05
9    3    39 2017-05-04
11   3    40 2015-05-06

再深入一点,我们需要两个条件来过滤。
1.任何具有less的值,而不是它们之间的year增量。
1.取两者中较高的一个。

相关问题