我的数据框中有timestamp
和id
个变量(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])
如何考虑id
和timestamp
以获得重复的行?
答案 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
。