いくつかの行が共通する 2 つの pandas データ フレームがあります。
dataframe2 が dataframe1 のサブセットであるとします。
dataframe2 にない dataframe1 の行を取得するにはどうすればよいですか?
df1 = pandas.DataFrame(data = {'col1' : [1, 2, 3, 4, 5], 'col2' : [10, 11, 12, 13, 14]})
df2 = pandas.DataFrame(data = {'col1' : [1, 2, 3], 'col2' : [10, 11, 12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
df2
col1 col2
0 1 10
1 2 11
2 3 12
期待される結果:
col1 col2
3 4 13
4 5 14
ベストアンサー1
df1
現在選択されているソリューションでは、結果が正しくありません。この問題を正しく解決するには、からへの左結合を実行しdf2
、最初に の一意の行だけを取得するようにしますdf2
。
まず、元のDataFrameを変更して、データ[3、10]を含む行を追加する必要があります。
df1 = pd.DataFrame(data = {'col1' : [1, 2, 3, 4, 5, 3],
'col2' : [10, 11, 12, 13, 14, 10]})
df2 = pd.DataFrame(data = {'col1' : [1, 2, 3],
'col2' : [10, 11, 12]})
df1
col1 col2
0 1 10
1 2 11
2 3 12
3 4 13
4 5 14
5 3 10
df2
col1 col2
0 1 10
1 2 11
2 3 12
左結合を実行し、のdf2
各行がdf1
の 1 行と正確に結合されるように、 の重複を排除しますdf2
。 パラメータを使用してindicator
、行がどのテーブルからのものであるかを示す追加の列を返します。
df_all = df1.merge(df2.drop_duplicates(), on=['col1','col2'],
how='left', indicator=True)
df_all
col1 col2 _merge
0 1 10 both
1 2 11 both
2 3 12 both
3 4 13 left_only
4 5 14 left_only
5 3 10 left_only
ブール条件を作成します。
df_all['_merge'] == 'left_only'
0 False
1 False
2 False
3 True
4 True
5 True
Name: _merge, dtype: bool
他の解決策が間違っている理由
いくつかのソリューションは同じ間違いを犯しています。つまり、各値が各列に独立して存在するかどうかのみをチェックし、同じ行に一緒に存在するかどうかはチェックしません。一意ではあるが両方の列の値を持つ最後の行を追加すると、間違いがdf2
明らかになります。
common = df1.merge(df2,on=['col1','col2'])
(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))
0 False
1 False
2 False
3 True
4 True
5 False
dtype: bool
この解決策では同じ間違った結果になります:
df1.isin(df2.to_dict('l')).all(1)