找到重复的行python

时间:2016-10-05 19:50:15

标签: python pandas timestamp duplicates

我的数据框中有timestampid个变量(df

timestamp                    id
2016-06-09 8:33:37           a1  
2016-06-09 8:33:37           a1  
2016-06-09 8:33:38           a1
2016-06-09 8:33:39           a1
2016-06-09 8:33:39           a1
2016-06-09 8:33:37           b1
2016-06-09 8:33:38           b1

每个id不能有两个时间戳。我必须为每个id打印这些重复的时间戳。在我的上述情况中,输出应该是行1,2,4,5

以下代码将提供重复的timestamp

set([x for x in df['timestamp'] if df['timestamp'].count(x) > 1])

如何考虑idtimestamp以获得重复的行?

2 个答案:

答案 0 :(得分:1)

您可以使用groupby并按Series.duplicated获取每个组的所有重复值的掩码。上次使用boolean indexing

print (df.groupby(['id'])['timestamp'].apply(lambda x: x.duplicated(keep=False)))
0     True
1     True
2    False
3     True
4     True
5    False
6    False
Name: timestamp, dtype: bool

print (df[df.groupby(['id'])['timestamp'].apply(lambda x: x.duplicated(keep=False))])
            timestamp  id
0 2016-06-09 08:33:37  a1
1 2016-06-09 08:33:37  a1
3 2016-06-09 08:33:39  a1
4 2016-06-09 08:33:39  a1

答案 1 :(得分:0)

如果您想查找所有重复项,请使用duplicated方法。它只适用于列。另一方面,df.index.duplicated适用于索引。因此,我们快速reset_index将索引放入列中。

df = df.reset_index()
df.ix[df.duplicated(keep=False)]

    index               id
0   2016-06-09 8:33:37  a1
1   2016-06-09 8:33:37  a1
3   2016-06-09 8:33:39  a1
4   2016-06-09 8:33:39  a1

如果您只想删除重复项,则可以使用DataFrame方法drop_duplicates

df = df.reset_index()
df = df.drop_duplicates() # keep='first' by default.

    index               id
0   2016-06-09 8:33:37  a1
2   2016-06-09 8:33:38  a1
3   2016-06-09 8:33:39  a1
5   2016-06-09 8:33:37  b1
6   2016-06-09 8:33:38  b1

如果您希望取回旧索引,请使用默认列名称' index'对于上述任何一种,只需使用。

df.set_index('index')

                    id
index               
2016-06-09 8:33:37  a1
2016-06-09 8:33:38  a1
2016-06-09 8:33:39  a1
2016-06-09 8:33:37  b1
2016-06-09 8:33:38  b1

上述方法允许您通过将keep属性设置为'first''last'False来选择是保留第一个,最后一个还是不重复。因此,要删除df中的所有重复项,请使用keep=False