函数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的副本。
是否有一种聪明的方法来识别哪些行是重复的以及这些行是重复的?
答案 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))