2017-10-10 36 views
1

我想查看我的数据框中每个索引对应的唯一值。假设我有以下数据框:在熊猫数据框中找到具有相同索引的列中的唯一值

 A 
ind1 a 
ind1 a 
ind1 a 
ind1 b 
ind1 b 
ind2 a 
ind2 b 
ind2 c 

我怎样才能得到一个表:

 index_related_uniqe 
ind1 a 
ind1 b 
ind2 a 
ind2 b 
ind2 c 

我试图用drop_duplicates,但其适用于去除整个列。

例如df.drop_duplicates( 'A',一直= '第一')给出:

ind1 a 
ind1 b 
ind2 c 

任何想法是高度赞赏。

+1

使用'df.reset_index()的神器。drop_duplicates()。set_index( '索引')' – Zero

+0

很好,谢谢!它确实有效。 –

回答

1

选项1
使用pd.DataFrame.duplicated重置索引和使用该值作为一个布尔掩模之后。这减少了重置索引然后重新设置的需要。我们只是重置以便采取的pd.DataFrame.duplicated优势,切片

df[~df.reset_index().duplicated().values] 

     A 
ind1 a 
ind1 b 
ind2 a 
ind2 b 
ind2 c 

选项2
我们可以使用发电机从完全创造新的大熊猫对象中删除自己。

d = {} 
z = zip(df.index.values.tolist(), df.A.values.tolist()) 
df[[False if k in d else d.setdefault(k, True) for k in z]] 

     A 
ind1 a 
ind1 b 
ind2 a 
ind2 b 
ind2 c 

定时

我们可以看到这种改进了这个微小的数据样本的性能。

%timeit df.reset_index().drop_duplicates().set_index('index') 
%timeit df[~df.reset_index().duplicated().values] 

%%timeit 
d = {} 
z = zip(df.index.values.tolist(), df.A.values.tolist()) 
df[[False if k in d else d.setdefault(k, True) for k in z]] 

1.53 ms ± 37.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
945 µs ± 44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 
188 µs ± 3.05 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 

它也避免了产生命名先前不知名的指数'index'

相关问题