LoginSignup
0
1

More than 5 years have passed since last update.

pandas dataframeを使った包含判定

Last updated at Posted at 2018-11-22

いくつか誤認していたので自分への戒め含めてメモ。

データの包含状況を確認したいのだが
軸となるデータに対して比較対象に軸となるデータが含まれているか。
ごく単純な話。完全一致に対して部分一致でもTrue判定されていない?の疑念。

でもこれは自分の完全な誤認でした。
正しい検証結果はこれ。

mergeにしてもisinにしても完全一致チェックです。

import pandas as pd

df1 = pd.DataFrame({
    'A':['/aaa/bbb/cccc/ddd.txt',
         '/aaa/bbb/cccc/ddd.txt',
         '/aaa/bbb/cccc/ddd',
         '/aaa/bbb/cccc',         
         '/aaa/bbb/cccc/ddd.csv'],
    'B':[1, 2, 3, 4, 5]
})

df2 = pd.DataFrame({
    'A':['/aaa/bbb/cccc/ddd.txt',
         '/aaa/bbb/cccc/eee.txt',
         '/aaa/bbb/cccc/eee',
         '/aaa/bbb/cccc/ddd.csv'],
    'B':[1, 2, 3, 4]    
})

print(df1)
print(df2)

# isinによる確認
print(df1['A'].isin(df2['A']))
print(df1[~df1['A'].isin(df2['A'])])

# mergeによる確認
df = pd.merge(df1, df2, on='A',how='left')
print(df[df.isnull().any(axis=1)])

結果

                       A  B
0  /aaa/bbb/cccc/ddd.txt  1
1  /aaa/bbb/cccc/ddd.txt  2
2      /aaa/bbb/cccc/ddd  3
3          /aaa/bbb/cccc  4
4  /aaa/bbb/cccc/ddd.csv  5

                       A  B
0  /aaa/bbb/cccc/ddd.txt  1
1  /aaa/bbb/cccc/eee.txt  2
2      /aaa/bbb/cccc/eee  3
3  /aaa/bbb/cccc/ddd.csv  4

0     True
1     True
2    False
3    False
4     True
Name: A, dtype: bool

                   A  B
2  /aaa/bbb/cccc/ddd  3
3      /aaa/bbb/cccc  4

                   A  B_x  B_y
2  /aaa/bbb/cccc/ddd    3  NaN
3      /aaa/bbb/cccc    4  NaN

誤認した原因は
merge結果の判定をisnull()だけでやっていて
isnull().any(axis=1)判定でやってなかったた。。。こと。

正しくはany(axis=1)横方向でやらねば当然誤認しますね

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1