pandasは他のデータフレームにない行を取得します 質問する

pandasは他のデータフレームにない行を取得します 質問する

いくつかの行が共通する 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)

おすすめ記事