Skip to main content
 首页 » 编程设计

python之我怎么知道 Pandas Data Frame 中哪些是重复的行

2025年05月04日20linjiqin

我正在使用 Pandas 和函数 duplicated()检测哪些行相等:

import pandas as pd 
 
d = { 
    1: {'name': 'n1', 1: 10, 2: 20, 3: 30}, 
    2: {'name': 'n2', 1: 10, 2: 20, 3: 30}, 
    3: {'name': 'n3', 1: 11, 2: 21, 3: 30}, 
    4: {'name': 'n4', 1: 11, 2: 21, 3: 30}, 
    5: {'name': 'n5', 1: 12, 2: 22, 3: 30}, 
    6: {'name': 'n6', 1: 13, 2: 22, 3: 30}, 
    7: {'name': 'n7', 1: 14,        3: 35}, 
    8: {'name': 'n8',        2: 22, 3: 35}, 
} 
pd.DataFrame.from_dict(d).transpose().set_index('name') 

这给了我一个像这样的漂亮数据框:

          1    2   3 
name               
n1       10   20  30    # same as n2 
n2       10   20  30    # same as n1 
n3       11   21  30    # same as n4 
n4       11   21  30    # same as n3 
n5       12   22  30 
n6       13   22  30 
n7       14  NaN  35 
n8      NaN   22  35 

现在我想对那些列相同的行进行分组。也就是说,我希望 Pandas 告诉我行 n1 和 n2 是相等的,所以 n3 和 n4 > 是。

使用 duplicated() 我得到了一些有趣的结果:

df[df.duplicated(keep=False)] 
         1   2   3 
name             
n1      10  20  30 
n2      10  20  30 
n3      11  21  30 
n4      11  21  30 

这是正确的,因为它显示了那些重复的行。但是,我的目标是了解哪些是那些列,以及哪些是重复的元组。也就是说,我需要一个 [(n1, n2), (n3,n4)] 形式的结果,一个相互重复的列表。列表、字典,任何对我有用的东西,只要它有这些信息。

我一直在浏览 Pandas 的文档,但找不到类似的内容。我尝试了一点 groupby() , 但没有任何合理的出现。

请您参考如下方法:

您可以使用 groupby按所有列并将索引转换为每个组的列表,最后将 Series 转换为列表:

df1 = df[df.duplicated(keep=False)] 
 
df1 = df1.groupby(df1.columns.tolist()).apply(lambda x: x.index.tolist()).values.tolist() 
print (df1) 
[['n1', 'n2'], ['n3', 'n4']] 

详细信息:

print (df1.groupby(df1.columns.tolist()).apply(lambda x: x.index.tolist())) 
1   2   3  
10  20  30    [n1, n2] 
11  21  30    [n3, n4] 
dtype: object