在多个条件上删除重复的Pandas索引

时间:2016-11-02 21:18:41

标签: python pandas duplicates

我有一个大型数据集,我使用id号作为索引。在我开始处理之前,我需要处理一些显示的重复ID,但需要根据多个条件来完成 - 基本上我希望所有重复条目中的最佳条目每个id。

在这个例子中,我可能首先希望它使用最近一年的副本 - 这将使id 1唯一。但是id 3仍然有两个值,所以我希望它进入下一个条件 - 在这种情况下我们会说最大值:

import pandas as pd
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]}
df = pd.DataFrame(data).set_index('id')

dups = df[df.index.duplicated(keep=False)]

for id in dups.index.unique():
    current = dups.loc[id]
    max_yr = current['year'].max()
    #continue to process using multiple conditionals inside the loop

结果如下:

    val  year
id
1     7  2001
1     8  2002
2     9  2002
3    17  2001
3    11  2002
3    12  2002

转向:

    val  year
id
1     8  2002
2     9  2002
3    12  2002

它有效,但效率非常低,我觉得必须有一个矢量化或至少更好的方法来实现这一目标。可以合并一个groupby,但我还是不确定如果不循环遍历这些组,我将如何做到这一点。

1 个答案:

答案 0 :(得分:1)

我们的想法是添加一个化合物列,它只能确定最佳匹配。例如,如果第一个标准是max(year),第二个标准是max(val),则可以将它们合并为tuple并获取该列的最大值。如果某个条件为min(X),则可以将-X添加到元组。 (tuples are compared element by element

import pandas as pd
data = {'id':[1, 1, 2, 3, 3, 3], 'year':[2001, 2002, 2002, 2001, 2002, 2002], 'val':[7, 8, 9, 17, 11, 12]}
df = pd.DataFrame(data).set_index('id')
df['year_val'] = df.apply(lambda row: (row.year, row.val), axis=1)
df.reset_index().groupby('id').apply(
    lambda df: df[df['year_val'] == df['year_val'].max()]).drop(
    ['year_val'], axis=1).set_index('id')

    val  year
id           
1     8  2002
2     9  2002
3    12  2002