我正在使用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()
,但没有任何合理的结果。
答案 0 :(得分:5)
您可以使用所有列的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