いくつか誤認していたので自分への戒め含めてメモ。
データの包含状況を確認したいのだが
軸となるデータに対して比較対象に軸となるデータが含まれているか。
ごく単純な話。完全一致に対して部分一致でも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)横方向でやらねば当然誤認しますね