在Pandas DataFrame中的一列中查找具有相同索引的唯一值

时间:2017-10-10 16:32:24

标签: python pandas dataframe

我正在尝试查看与数据框中每个索引相对应的唯一值。假设我有以下数据框:

        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&#39 ;, keep =' first')给出:

ind1    a   
ind1    b   
ind2    c 

非常感谢任何想法。

1 个答案:

答案 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
我们可以使用生成器来完全删除自己创建新的pandas对象。

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'

的工件