SQLと同等の方法を探しています
SELECT DISTINCT col1, col2 FROM dataframe_table
パンダのSQL比較には、に関する何もありませんdistinct。
.unique() 単一の列でのみ機能するので、列を連結するか、それらをリスト/タプルに入れてその方法で比較できると思いますが、これはパンダがよりネイティブな方法で行うべきもののようです。
明らかなものがないか、これを行う方法はありませんか?
SQLと同等の方法を探しています
SELECT DISTINCT col1, col2 FROM dataframe_table
パンダのSQL比較には、に関する何もありませんdistinct。
.unique() 単一の列でのみ機能するので、列を連結するか、それらをリスト/タプルに入れてその方法で比較できると思いますが、これはパンダがよりネイティブな方法で行うべきもののようです。
明らかなものがないか、これを行う方法はありませんか?
回答:
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を参照してください。
df.drop_duplicates()デフォルトでそう(残し、新たなデータフレームを返し、インプレース方式ではありませんdf変わらず)。これはかなり標準的な動作ですが、まだ有用な指摘である可能性があります。
さまざまな解決策を試しました。最初は:
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)
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)}
np.unique(df[['column1','column2']].values)
drop duplicateデータフレームによっては使用してもあまり役に立たないと思う。
私はこれを見つけました:
[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)
そして私のために働きなさい!
https://riptutorial.com/pandas/example/26077/select-distinct-rows-across-dataframe
df.apply(pd.Series.unique)がありますが、一意の値の数が列間で異なる場合、これは機能しません。そのため、キーとしての列名と値としての一意の値の