查找大熊猫对同一索引的数据框索引是否重复?

时间:2019-05-21 01:39:49

标签: pandas

示例:

 | param_a | param_b | param_c
1 | 0       | 0       | 0
1 | 0       | 2       | 1
3 | 2       | 1       | 1
4 | 0       | 2       | 1
3 | 2       | 1       | 1
4 | 0       | 0       | 0
4 | 0       | 0       | 0

对于重复的索引(1,3,4),我想在每个索引不同的地方找到它们。以索引1和4为例,存在不同的索引。

输出:

   param_a  param_b  param_c     
1        0        0        0  
1        0        2        1  
4        0        2        1
4        0        0        0

注意:它为每个重复的索引返回唯一索引。

我推荐了this post,但没有得到答案。

3 个答案:

答案 0 :(得分:3)

IIUC,使用tuple,在reset_index获得df中的所有值作为组密钥之后,然后我们用transform nunique过滤df,然后再过滤{{1 }}

drop_duplicates

答案 1 :(得分:2)

首先将索引转换为列,并用DataFrame.drop_duplicates删除重复项,然后用indexSeries.duplicatedboolean indexing获取每列keep=False的所有重复项:

df = df.reset_index().drop_duplicates()
print (df)
   index  param_a  param_b  param_c
0      1        0        0        0
1      1        0        2        1
2      3        2        1        1
3      4        0        2        1
6      4        0        0        0

print (df['index'].duplicated(keep=False))
0     True
1     True
2    False
3     True
6     True
Name: index, dtype: bool

df1 = df[df['index'].duplicated(keep=False)].set_index('index').rename_axis(None)
print (df1)
   param_a  param_b  param_c
1        0        0        0
1        0        2        1
4        0        2        1
4        0        0        0

答案 2 :(得分:1)

我对duplicated进行了这种尝试:(还有参数using (ZipFile archive = new ZipFile(@"" + System.Environment.CurrentDirectory + "\\thezipfile.zip")) { archive.ExtractAll(@"" + System.Environment.CurrentDirectory, ExtractExistingFileAction.OverwriteSilently); } 用于保留重复项或不重复):

keep

df=df.reset_index()
mask = pd.DataFrame(np.sort(df[list(df)], axis=1), index=df.index).duplicated()
df1 = df[~mask]
df1=df1.set_index('index')

如果您尝试保留重复项:

   param_a  param_b  param_c
1        0        0        0
1        0        2        1
3        2        1        1
4        0        2        1
3        2        1        1
4        0        0        0
4        0        0        0
   index  param_a  param_b  param_c
0      1        0        0        0
1      1        0        2        1
2      3        2        1        1
3      4        0        2        1
4      3        2        1        1
5      4        0        0        0
6      4        0        0        0
       param_a  param_b  param_c
index                           
1            0        0        0
1            0        2        1
3            2        1        1
4            0        2        1
4            0        0        0

您将以结果结尾:

mask = pd.DataFrame(np.sort(df[list(df)], axis=1), index=df.index).duplicated(keep=False)

哪个再次关闭,但由于存在:

       param_a  param_b  param_c
index                           
1            0        0        0
1            0        2        1
4            0        2        1

在帐户中,因为它有重复的行(索引为4),并且应该是因为存在另一行的起始索引为4。

这很接近,但这是直接的方法。