2017-10-10 10 views
1

私のデータフレーム内の各インデックスに対応する一意の値が何かを調べようとしています。私は、次のデータフレームを持っていると仮定します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'、 '最初の' =保つ)を与える:

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'

関連する問題