如何在具有一些复杂条件的pandas数据框中删除重复项?

3

我正在尝试根据一些条件删除重复项。我的数据框看起来像这样:

idx  a    b    c   d   e  f
1    1   ss1   0   25  A  B
2    3   ss7   0   25  A  B
3    5   ss5   0   12  C  D
4    11  im3   0   12  C  D
5    5   ss8   0   50  C  K
6    9   im8   0   5   F  G
7    8   ix6   0   5   F  G

如果列 def 的值在数据框中的 subset=['d', 'e', 'f'] 中与其他记录匹配,则这些行被视为重复。例如,行1和2是重复的,行3和4是重复的,行6和7是重复的。选择要删除的行基于列 b

  1. 如果重复项(行1和2)的列 b 值都以 ss 开头,则可以删除任何一个

  2. 如果其中一个重复项以 ss 开头,而另一个以不同格式开头(行3和4),则应保留以 ss 开头的那个。

  3. 如果列 b 中的两个重复项都以除 ss 之外的任何内容开头(行6和7),则可以选择任何一个。

因此,预期输出应该类似于:

idx  a    b    c   d   e  f
2    3   ss7   0   25  A  B
3    5   ss5   0   12  C  D
5    5   ss8   0   50  C  K
7    8   ix6   0   5   F  G
1个回答

3
按照键值 b 进行排序(以 'ss' 开头的所有内容都被移至末尾),然后从 ['d', 'e', 'f'] 中删除重复项(保留最后一个)。
out = (df.sort_values('b', key=lambda x: x.str.startswith('ss'))
         .drop_duplicates(['d', 'e', 'f'], keep='last').sort_index())

# OR

out = (df.sort_values('b', key=lambda x: x.str.startswith('ss'))
         .groupby(['d', 'e', 'f'], as_index=False).nth(-1).sort_index())

输出:

>>> out
   idx  a    b  c   d  e  f
1    2  3  ss7  0  25  A  B
2    3  5  ss5  0  12  C  D
4    5  5  ss8  0  50  C  K
6    7  8  ix6  0   5  F  G

感谢您的帮助。如果您将结果插入到新的数据框中,它可以完美地运行,但是如果我想在相同的数据框上运行并添加'inplace = True',则会抛出错误“AttributeError: 'NoneType' object has no attribute 'sort_index'”。 - sam_alloy
如果您使用原地修改,Pandas 将不会返回一个数据帧,因此您无法链接任何其他方法,例如 set_index。将来版本的 Pandas 将不支持 inplace 操作。 - Corralien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接