我有一个关于在数据框中查找重复项以及使用特定列删除数据框中重复项的问题。 以下是我要完成的任务:
是否可以删除重复但保留前2?
以下是我当前数据框的一个名为df的示例,并查看我在下面放置的括号注释,以便您了解。
注意:如果'Roll'= 1,那么我想查看Date列,看看该列中是否有第二个重复的日期...保留这两个并删除任何其他日期。
Date Open High Low Close Roll Dupes
1 19780106 236.00 237.50 234.50 235.50 0 NaN
2 19780113 235.50 239.00 235.00 238.25 0 NaN
3 19780120 238.00 239.00 234.50 237.00 0 NaN
4 19780127 237.00 238.50 235.50 236.00 1 NaN (KEEP)
5 19780203 236.00 236.00 232.25 233.50 0 NaN (KEEP)
6 19780127 237.00 238.50 235.50 236.00 0 NaN (KEEP)
7 19780203 236.00 236.00 232.25 233.50 0 NaN (DELETE)
8 19780127 237.00 238.50 235.50 236.00 0 NaN (DELETE)
9 19780203 236.00 236.00 232.25 233.50 0 NaN (DELETE)
这是目前正在删除所有欺骗,但它正在删除所有欺骗(显然)
df = df.drop_duplicates('Date')
编辑:我忘了提一下,我想要保留的唯一重复是列'Roll'= 1
如果是,则根据“日期”列保留该行和下一个匹配的行
答案 0 :(得分:2)
将head
与groupby一起使用会保留每个组中的前x个条目,我认为这样可以实现您想要的效果。
In [52]: df.groupby('Date').head(2)
Out[52]:
Date Open High Low Close Roll
1 19780106 236.0 237.5 234.50 235.50 0
2 19780113 235.5 239.0 235.00 238.25 0
3 19780120 238.0 239.0 234.50 237.00 0
4 19780127 237.0 238.5 235.50 236.00 0
5 19780203 236.0 236.0 232.25 233.50 0
6 19780127 237.0 238.5 235.50 236.00 0
7 19780203 236.0 236.0 232.25 233.50 0
编辑:
In [16]: df['dupe_count'] = df.groupby('Date')['Roll'].transform('max') + 1
In [17]: df.groupby('Date', as_index=False).apply(lambda x: x.head(x['dupe_count'].iloc[0]))
Out[17]:
Date Open High Low Close Roll Dupes dupe_count
0 1 19780106 236.0 237.5 234.50 235.50 0 NaN 1
1 2 19780113 235.5 239.0 235.00 238.25 0 NaN 1
2 3 19780120 238.0 239.0 234.50 237.00 0 NaN 1
3 4 19780127 237.0 238.5 235.50 236.00 1 NaN 2
6 19780127 237.0 238.5 235.50 236.00 0 NaN 2
4 5 19780203 236.0 236.0 232.25 233.50 0 NaN 1
答案 1 :(得分:1)
假设Roll
只能取值0和1,如果你这样做
df.groupby(['Date', 'Roll'], as_index=False).first()
你会得到两行日期,其中一行有Roll = 1
,只有一行只有Roll = 0
的日期,我认为这就是你想要的。
如果传递as_index=False
,那么组键不会在评论中讨论的索引中结束。