1. ホーム
  2. パイソン

[解決済み】pandasが他のデータフレームに存在しない行を取得する。

2022-03-26 19:01:50

質問

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

解決方法は?

一つの方法は、内部マージの結果を両方のDFSに格納することで、一方の列の値がこの共通項にない場合に行を選択するだけでよい。

In [119]:

common = df1.merge(df2,on=['col1','col2'])
print(common)
df1[(~df1.col1.isin(common.col1))&(~df1.col2.isin(common.col2))]
   col1  col2
0     1    10
1     2    11
2     3    12
Out[119]:
   col1  col2
3     4    13
4     5    14

EDIT

もう一つの方法は、あなたが見つけたように isin を生成します。 NaN の行を削除することができます。

In [138]:

df1[~df1.isin(df2)].dropna()
Out[138]:
   col1  col2
3     4    13
4     5    14

しかし、df2が同じように行を開始しない場合、これはうまくいきません。

df2 = pd.DataFrame(data = {'col1' : [2, 3,4], 'col2' : [11, 12,13]})

は、df全体を生成します。

In [140]:

df1[~df1.isin(df2)].dropna()
Out[140]:
   col1  col2
0     1    10
1     2    11
2     3    12
3     4    13
4     5    14