繁体   English   中英

如何删除熊猫数据框中的唯一行?

[英]How to drop unique rows in a pandas dataframe?

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

假设这是我的数据:

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

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

我尝试了以下方法:

# 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)]

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

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

您可以使用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

我想出了一个使用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)]

Duplicates 现在有正确的结果:

    A       B   C
2   foo     1   B
3   bar     1   A

另外,我在这个问题中的最初尝试可以通过在drop_duplicates方法中简单地添加keep=Falsedrop_duplicates

# 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(keep=False)
duplicates = df[~df.index.isin(uniques.index)]

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

df1 = df.drop_duplicates(['A', 'B'],keep=False)

df1 = pd.concat([df, df1])

df1 = df1.drop_duplicates(keep=False)

当您有两个包含数百万条记录的数据集dfXdfY时,此技术更合适。 您可以先连接dfXdfY然后执行相同的步骤。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM