识别python pandas中的重复对

时间:2015-03-26 11:11:42

标签: python pandas duplicates duplicate-removal

函数pd.duplicated()为您提供一个布尔序列,指示数据框中的哪些行重复,如下所示:

0     False
1     False
2     False
3     False
4      True
5     False
6      True
7      True
8      True
9      True
10     True
dtype: bool

然而,它并没有告诉你重复的哪一行是重复的。 例如,索引4可以是0,1,2,3或5的副本。

是否有一种聪明的方法来识别哪些行是重复的以及这些行是重复的?

4 个答案:

答案 0 :(得分:1)

尝试使用groupby,size和filter来查看大小超过1的那些。

>>> df = pd.DataFrame([[1, 1], [1, 2], [1, 1], [2, 2], [2, 2], [1, 3]], columns=["a", "b"])
>>> results = df.groupby(["a", "b"]).size()                                 
>>> results = results[results > 1]
>>> results
a  b
1  1    2
2  2    2
dtype: int64

您还可以进行排序以获得最重复的(如果您感兴趣)

答案 1 :(得分:1)

您可以使用.groupby获取以下内容:

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3, 3, 2, 0, 4, 5, 6]})
df.groupby('a').groups
# {0: [5], 1: [0], 2: [1, 4], 3: [2, 3], 4: [6], 5: [7], 6: [8]}

然后决定dict你要做什么的价值......

答案 2 :(得分:0)

较新版本的pandas有一个'keep'选项,您可以在其中指定要标记的值。在这种情况下,您将标记keep = False(并将它们全部标记)

In [2]: df = pd.DataFrame({'x':[1, 2, 4, 4, 5]})
In [3]: df
Out[3]:
   x
0  1
1  2
2  4
3  4
4  5
In [4]: df.duplicated('x', keep=False)
Out[4]:
0    False
1    False
2     True
3     True
4    False
dtype: bool

答案 3 :(得分:0)

<块引用>

但是它不会告诉您重复项是重复的哪一行。例如,索引 4 可能是 0、1、2、3 或 5 的副本。

.duplicated(keep=False) 丢弃有关重复“组”所在位置的信息。我找到了两种解决方法:一种是在 for 循环中使用 .unique(),另一种是 s.groupby(s)

s = pd.Series(["A","B","C","A","A","B","D","E"])

# what i want is a string like this

"""
0, 3 and 4: A
1 and 5: B
2: C
6: D
7: E
"""

string = ""
for val in s.unique():
    # here, we have access to the grouped values in s[s == val]
    string += do_something(s[s == val])

# this is another way
string = s.groupby(s).apply(lambda x: do_something_else(x.index))