pd.unique
入力配列、またはDataFrame列またはインデックスから一意の値を返します。
この関数への入力は1次元である必要があるため、複数の列を組み合わせる必要があります。最も簡単な方法は、必要な列を選択してから、値をフラット化されたNumPy配列で表示することです。操作全体は次のようになります。
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
ravel()
多次元配列のビュー(可能な場合)を返す配列メソッドであることに注意してください。引数'K'
は、要素がメモリに格納されている順序で配列をフラット化するようにメソッドに指示します(パンダは通常、基になる配列をFortranの連続した順序で格納します。列は行の前に格納されます)。これは、メソッドのデフォルトの「C」順序を使用するよりもはるかに高速です。
別の方法は、列を選択してそれらに渡すことnp.unique
です:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
ravel()
メソッドが多次元配列を処理するため、ここで使用する必要はありません。それでも、pd.unique
一意の値を識別するためにハッシュテーブルではなくソートベースのアルゴリズムを使用する場合よりも遅くなる可能性があります。
速度の違いは、より大きいDataFrameの場合に重要です(特に、一意の値がほんの少ししかない場合)。
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})