回答:
これはパンダで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)
df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)
?
df.drop_duplicates(subset=[df.columns[0:2]], keep = False)
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
実際には、行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]
df.drop_duplicates(['A','C'])
、質問で述べたように、デフォルトで1つの観測が最初または最後の観測を保持するように使用します-メモリから書き込んでいるときにキーワードが間違っていることに気付きました。必要なのは、対象の列(サンプルデータのAとC)で同一のすべての行を削除することです。
これらのさまざまなことを試してください
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')