パンダの複数のデータフレーム列で「個別」を選択する方法は?


101

SQLと同等の方法を探しています

SELECT DISTINCT col1, col2 FROM dataframe_table

パンダのSQL比較には、に関する何もありませんdistinct

.unique() 単一の列でのみ機能するので、列を連結するか、それらをリスト/タプルに入れてその方法で比較できると思いますが、これはパンダがよりネイティブな方法で行うべきもののようです。

明らかなものがないか、これを行う方法はありませんか?


あなたは次のようなことをする必要df.apply(pd.Series.unique)がありますが、一意の値の数が列間で異なる場合、これは機能しません。そのため、キーとしての列名と値としての一意の値の
辞書を作成する必要が

回答:


172

drop_duplicatesメソッドを使用して、DataFrame内の一意の行を取得できます。

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

subset特定の列のみを使用して一意性を判断する場合は、キーワード引数を指定することもできます。docstringを参照してください。


3
ことは注目に値するおそらくdf.drop_duplicates()デフォルトでそう(残し、新たなデータフレームを返し、インプレース方式ではありませんdf変わらず)。これはかなり標準的な動作ですが、まだ有用な指摘である可能性があります。
エボファージ

13

さまざまな解決策を試しました。最初は:

a_df=np.unique(df[['col1','col2']], axis=0)

これはオブジェクトデータではなくうまく機能します。これを実行してエラーを回避する別の方法(オブジェクト列タイプの場合)は、drop_duplicates()を適用することです。

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

SQLを使用してこれを行うこともできますが、私の場合は非常に遅くなります。

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)

7

uniquedf の方法はありません。各列の一意の値の数が同じである場合、以下が機能df.apply(pd.Series.unique)します。そうでない場合は、エラーが発生します。別のアプローチは、列名をキーとするdictに値を格納することです。

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}

複数の列の一意性をチェックすることは可能ですか?
Anoop D

numpyを使用して別のSO質問から回答を得たnp.unique(df[['column1','column2']].values)
Anoop D

6

同様の問題を解決するために、私は次を使用していgroupbyます:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

それが適切かどうかは、結果で何をしたいかによって異なります(私の場合、私COUNT DISTINCTは示されているものと同等のものを欲しかっただけです)。



-1

列のセットを取り、大きいセットから小さいセットを差し引くだけです。

distinct_values = set(df['a'])-set(df['b'])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.