Python Pandasのすべての重複行を削除する


159

このpandas drop_duplicates関数は、データフレームを「一意化」するのに最適です。しかし、合格するキーワード引数の一つがあるtake_last=Truetake_last=False、私は列のサブセット間で重複しているすべての行をドロップしたいと思いながら、。これは可能ですか?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

一例として、私は、列に一致する行ドロップしたいAC行0と1をドロップする必要があり、このように。

回答:


233

これはパンダでdrop_duplicatesとkeepパラメータを使ってはるかに簡単になりました。

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)

2
列が明示的にラベル付けされていない場合はどうなりますか?インデックスに基づいて列を選択するにはどうすればよいですか?
Hamman Samuel

2
たぶんdf.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)
ベン

5
あなたが試すことができますdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
seeiespi 2018

67

drop_duplicatesに関するBenの回答に追加したいだけです。

keep :{'first'、 'last'、False}、デフォルトは 'first'

  • first:最初の出現を除いて重複を削除します。

  • last:最後に発生したものを除いて重複を削除します。

  • False:すべての重複を削除します。

したがってkeep、Falseに設定すると、望ましい答えが得られます。

DataFrame.drop_duplicates(* args、** kwargs)重複する行が削除されたDataFrameを返します。オプションで特定の列のみを考慮します

パラメータ:サブセット:列ラベルまたはラベルのシーケンス、オプション特定の列のみを考慮して重複を識別します。デフォルトでは、すべての列を使用しますkeep:{'first'、 'last'、False}、デフォルト 'first' first:重複を除外最初の発生。last:最後に発生したものを除いて重複を削除します。False:すべての重複を削除します。take_last:非推奨inplace:ブール値、デフォルトFalse重複をその場で削除するか、コピーを返すかcols:kwargsサブセットの引数のみ[非推奨]戻り値:deduplicated:DataFrame


25

結果を別のデータセットに保存する場合:

df.drop_duplicates(keep=False)

または

df.drop_duplicates(keep=False, inplace=False)

同じデータセットを更新する必要がある場合:

df.drop_duplicates(keep=False, inplace=True)

上記の例はDISTINCT *、SQL と同様に、すべての重複を削除して1つ保持します


11

使用groupbyしてfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)

4

実際には、行0と1をドロップすることだけが必要です(一致したAとCを含む観測は保持されます)。

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

しかし、あなたが本当に望んでいるのはこれだと思います(一致したAとCを含む1つの観測が保持されます)。

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

編集:

これで、より明確になりました:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]

1
それが私が望んだものである場合df.drop_duplicates(['A','C'])、質問で述べたように、デフォルトで1つの観測が最初または最後の観測を保持するように使用します-メモリから書き込んでいるときにキーワードが間違っていることに気付きました。必要なのは、対象の列(サンプルデータのAとC)で同一のすべての行を削除することです。
ジェイミーブル

-1

これらのさまざまなことを試してください

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

または

>>>df.drop_duplicates( keep='first')

または

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