如何删除pandas数据帧中的唯一行?

时间:2017-07-03 15:04:53

标签: python pandas dataframe

我遇到了一个看似简单的问题:在pandas数据帧中删除唯一的行。基本上,与drop_duplicates()相反。

让我们说这是我的数据:

mergedList =[{
          'time': '2017-07-03T01:12:13Z'
        }]

当A和B是唯一的时,我想删除行,即我只想保留第1行和第2行。

我尝试了以下内容:

    A       B   C  
0   foo     0   A
1   foo     1   A
2   foo     1   B
3   bar     1   A

但我只得到第2行,因为0,1和3都是唯一的!

2 个答案:

答案 0 :(得分:8)

选择所有重复行的解决方案:

您可以将duplicated与子集和参数keep=False一起用于选择所有重复项:

df = df[df.duplicated(subset=['A','B'], keep=False)]
print (df)
     A  B  C
1  foo  1  A
2  foo  1  B

transform的解决方案:

df = df[df.groupby(['A', 'B'])['A'].transform('size') > 1]
print (df)
     A  B  C
1  foo  1  A
2  foo  1  B

用于选择所有唯一行的位修改解决方案:

#invert boolean mask by ~
df = df[~df.duplicated(subset=['A','B'], keep=False)]
print (df)
     A  B  C
0  foo  0  A
3  bar  1  A

df = df[df.groupby(['A', 'B'])['A'].transform('size') == 1]
print (df)
     A  B  C
0  foo  0  A
3  bar  1  A

答案 1 :(得分:1)

我想出了一个使用# Load Dataframe df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]}) uniques = df[['A', 'B']].drop_duplicates() duplicates = df[~df.index.isin(uniques.index)] 的解决方案:

groupby

重复现在有正确的结果:

groupped = df.groupby(['A', 'B']).size().reset_index().rename(columns={0: 'count'})
uniques = groupped[groupped['count'] == 1]
duplicates = df[~df.index.isin(uniques.index)]

此外,只需在 A B C 2 foo 1 B 3 bar 1 A 方法中添加keep=False即可解决我在问题中的原始尝试:

drop_duplicates

请@jezrael回答,我认为这是最安全的(?),因为我在这里使用pandas索引。