12

identifier のレコードが重複している可能性があるデータセットがありますappkey。重複したレコードは理想的には存在しないはずなので、データ収集のミスだと思います。appkey複数回発生するのすべてのインスタンスを削除する必要があります。

このdrop_duplicates方法は、重複の最初または最後のいずれかを選択するため、この場合 (またはそうですか?) 役に立ちません。パンダでこれを達成するための明白なイディオムはありますか?

4

4 に答える 4

8

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
于 2013-09-17T14:18:38.723 に答える
7

カウント付きの変換を使用する 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
于 2013-09-17T14:09:57.407 に答える
2

pandas バージョン 0.17 では、drop_duplicates 関数に「keep」パラメーターがあり、「False」に設定して重複したエントリを保持しないようにすることができます (他のオプションは keep='first' および keep='last' です)。したがって、この場合は次のようになります。

df.drop_duplicates(subset=['appkey'],keep=False)
于 2015-10-28T11:09:54.860 に答える