使用pandas查找不同组之间的重复行

2024-10-02 12:30:07 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

考虑下面的数据文件:

data_so = {
        'ID':  [100, 100, 100, 200, 200, 300, 300, 300],
        'letter': ['A','B','A','C','D','E','D','A'],
}
df_so = pandas.DataFrame (data_so, columns = ['ID', 'letter'])

enter image description here

我想获得一个新列,其中不同组中的所有重复项均为真。同一组中的所有其他重复项都应为False

我试过的

我试过使用

df_so['dup'] = df_so.duplicated(subset=['letter'], keep=False)

但结果不是我想要的:

enter image description here

组1(第0行)中第一次出现的是True,因为另一个组(第7行)中存在重复项。但是,在同一组(第2行)中,所有其他A发生率应为False

如果删除了第7行,那么第0行应该是False,因为在任何其他组中都不再存在


Tags: columnsidfalsedataframepandasdfdataso
3条回答

正如您在评论中所阐明的,您需要在当前duplicated旁边添加一个掩码

m1 = df_so.duplicated(subset=['letter'], keep=False)
m2 = ~df_so.groupby('ID').letter.apply(lambda x: x.duplicated())

df_so['dup'] = m1 & m2

Out[157]:
    ID letter    dup
0  100      A   True
1  100      B  False
2  100      A  False
3  200      C  False
4  200      D   True
5  300      E  False
6  300      D   True
7  300      A   True
8  300      A  False

注意:我在评论中添加了row=8

我对这个问题的看法是:

import datatable as dt

df = dt.Frame(df_so)

df[:1, :, dt.by("ID", "letter")]

我将按ID和字母列进行分组。然后简单地选择第一行

您需要的基本上是两个不同的duplicated()调用的AND

  1. ~df_so.duplicated()组内交易

  2. df_so.drop_duplicates().duplicated(subset='letter',keep=False).fillna(True)忽略当前组重复项的组间交易

代码:

import pandas as pd
data_so = { 'ID':  [100, 100, 100, 200, 200, 300, 300, 300], 'letter': ['A','B','A','C','D','E','D','A'], }
df_so = pd.DataFrame (data_so, columns = ['ID', 'letter'])
df_so['dup'] = ~df_so.duplicated() & df_so.drop_duplicates().duplicated(subset='letter',keep=False).fillna(True)
print(df_so)

输出:

    ID letter    dup
0  100      A   True
1  100      B  False
2  100      A  False
3  200      C  False
4  200      D   True
5  300      E  False
6  300      D   True
7  300      A   True

其他情况:

data_so = { 'ID':  [100, 100, 100, 200, 200, 300, 300], 'letter': ['A','B','A','C','D','E','D'] }

输出:

    ID letter    dup
0  100      A  False
1  100      B  False
2  100      A  False
3  200      C  False
4  200      D   True
5  300      E  False
6  300      D   True

相关问题 更多 >

    热门问题