如何在Python Pandas的DataFrame中找到重复行中不同值所在的列?

3
我在Python中有一个DataFrame,如下所示,我们可以看到某些ID存在重复:
ID COL1 COL2 COL3
123 XX 111 ENG
123 abc 111 ENG
444 ccc 2 o
444 ccc 2 o
67 a 89 xx
我需要选择出现ID = 123的情况,其中行是重复的,但在某些列中我们有不同的值,因此输出应该像下面这样:
ID COL1 COL2 COL3
123 XX 111 ENG
123 abc 111 ENG
在Python Pandas中,我该如何做呢?我的真实数据集中有很多列,因此我需要创建适用于更多列而不仅仅是ID、COL1、COL2、COL3的解决方案 :)

你的问题已在这里得到解答:https://stackoverflow.com/questions/67231430/in-pandas-how-do-i-select-rows-that-have-a-duplicate-in-one-column-but-different - Ari Lupin
这个回答解决了你的问题吗?[在Pandas中,如何选择一个列有重复但另一个列的值不同的行?] (https://stackoverflow.com/questions/67231430/in-pandas-how-do-i-select-rows-that-have-a-duplicate-in-one-column-but-different) - René
Ari Lupin,Rene - 提到的问题并没有回答我的问题,因为我有更多的列,我提到的问题只有1列可能有不同的值。 - unbik
3个回答

1

首先去除所有列的重复项,然后查找id列的重复项。最后选择相同的id。

df = df.drop_duplicates()
mask = df.duplicated(subset=['ID'],keep=False)
df = df[mask]

0

使用.query

df = df.query("ID.eq(123)").drop_duplicates().reset_index(drop=True)
print(df)

    ID COL1  COL2 COL3
0  123   XX   111  ENG
1  123  abc   111  ENG

除非你不想过滤:

df = df.drop_duplicates().reset_index(drop=True)
print(df)

    ID COL1  COL2 COL3
0  123   XX   111  ENG
1  123  abc   111  ENG
2  444  ccc     2    o
3   67    a    89   xx

只有当id字段等于123时,此方法才有效。 - Bushmaster
是的,很难理解你确切想要什么,这就是为什么我也提供了一个非过滤版本。 - Jason Baker

0

这是一种实现的方式

# drop the duplicates
df.drop_duplicates(inplace=True)

# groupby ID and filter the ones where group size is greater than 1
df[df.groupby('ID')['ID'].transform('size')>1]


    ID  COL1    COL2    COL3
0   123     XX  111     ENG
1   123     abc     111     ENG

另外,

# preserve the original DF and create a secondary DF with non-duplicate rows
df2=df.drop_duplicates()

# using loc, select the rows in DF2 that has a group size exceeding 1
df2.loc[df2.groupby('ID')['ID'].transform('size')>1]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接