我正在尝试查看与数据框中每个索引相对应的唯一值。假设我有以下数据框:
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
非常感谢任何想法。
答案 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'