如何通过检查条件删除Pandas DataFrame中的重复项?

时间:2015-10-01 15:24:38

标签: python pandas dataframe

我有这个dataFrame:

ID | a |
-------- 
 1 | 10  
 1 | 40 
 2 | 5
 2 | 10 


df.drop_duplicates('ID')

我想通过检查列' ID'中的重复条目来删除重复行,并保留列a中值为10的行。

我希望我的结果df看起来像

ID | a 
-------- 
 1 | 10
 2 | 10

2 个答案:

答案 0 :(得分:1)

我已将您的数据扩展为包含没有重复项的数据点,并且重复10次重复的数据。

  

我想通过检查列' ID'中的重复条目来删除重复行,并保留列a中值为10的行。

我将此解释为保留没有重复项的行,并且仅当列a中的值等于10时才会保留重复项(这将导致相同ID的重复值,其中每个值的值为10)。 / p>

我使用Counter来计算每个ID的出现次数。然后,我为这些重复的ID行创建重复列表和DataFrame掩码。

最后,我使用.loc选择不在我的掩码中的行(即那些不重复的行)或重复但在a列中具有值10的行。此时,仍然可以为列a设置值为10的重复项。如果不需要,可以在结果中添加.drop_duplicates()

from collections import Counter

df = pd.DataFrame({'ID': [1, 1, 2, 2, 2, 3], 'a': [10, 40, 5, 10, 10, 5]})
>>> df
   ID   a
0   1  10
1   1  40
2   2   5
3   2  10
4   2  10
5   3   5

c = Counter(df.ID)
dups = [n for n in c if c[n] > 1]
mask = df.ID.isin(dups)
result = df.loc[(~mask) | ((mask) & (df.a == 10)), :]
>>> result
   ID   a
0   1  10
3   2  10
4   2  10
5   3   5

>>> result.drop_duplicates()
   ID   a
0   1  10
3   2  10
5   3   5

答案 1 :(得分:0)

在删除重复项之前,只需过滤a中的值:

df = df[df['a']==10]