identifier のレコードが重複している可能性があるデータセットがありますappkey
。重複したレコードは理想的には存在しないはずなので、データ収集のミスだと思います。appkey
複数回発生するのすべてのインスタンスを削除する必要があります。
このdrop_duplicates
方法は、重複の最初または最後のいずれかを選択するため、この場合 (またはそうですか?) 役に立ちません。パンダでこれを達成するための明白なイディオムはありますか?
identifier のレコードが重複している可能性があるデータセットがありますappkey
。重複したレコードは理想的には存在しないはずなので、データ収集のミスだと思います。appkey
複数回発生するのすべてのインスタンスを削除する必要があります。
このdrop_duplicates
方法は、重複の最初または最後のいずれかを選択するため、この場合 (またはそうですか?) 役に立ちません。パンダでこれを達成するための明白なイディオムはありますか?
pandas バージョン 0.12 の時点で、これがfilter
用意されています。@Andyのソリューションが を使用して行うこととまったく同じですtransform
が、もう少し簡潔でやや高速です。
df.groupby('AppKey').filter(lambda x: x.count() == 1)
@Andyの例を盗むには、
In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['AppKey', 'B'])
In [2]: df.groupby('AppKey').filter(lambda x: x.count() == 1)
Out[2]:
AppKey B
2 5 6
カウント付きの変換を使用する 1 つの方法を次に示します。
In [1]: df = pd.DataFrame([[1, 2], [1, 4], [5, 6]], columns=['AppKey', 'B'])
In [2]: df
Out[2]:
AppKey B
0 1 2
1 1 4
2 5 6
AppKey 列でグループ化し、変換カウントを適用すると、AppKey の各出現がカウントされ、そのカウントが表示される行に割り当てられます。
In [3]: count_appkey = df.groupby('AppKey')['AppKey'].transform('count')
In [4]: count_appkey
Out[4]:
0 2
1 2
2 1
Name: AppKey, dtype: int64
In [5]: count_appkey == 1
Out[5]:
0 False
1 False
2 True
Name: AppKey, dtype: bool
次に、これを元の DataFrame へのブール値マスクとして使用できます (AppKey が正確に 1 回発生する行のみを残します)。
In [6]: df[count_appkey == 1]
Out[6]:
AppKey B
2 5 6
pandas バージョン 0.17 では、drop_duplicates 関数に「keep」パラメーターがあり、「False」に設定して重複したエントリを保持しないようにすることができます (他のオプションは keep='first' および keep='last' です)。したがって、この場合は次のようになります。
df.drop_duplicates(subset=['appkey'],keep=False)