首页 > 解决方案 > return true if list of values is not in dataframe column (every single value)

问题描述

input data a:

obj  number
1    111
2    222
3    333
4    555

input data b:

obj  number
1    111
2    222
3    333
4    444

input data c:

obj  number
1    777
2    222
3    333
4    888

expected output data:

false
true
false

tried:

~set([111,444]).issubset(set(df_tmp['wahlnummer']))
not set([111,444]).issubset(set(df_tmp['wahlnummer']))
([111,444] not in df_tmp['wahlnummer'])

actual output a:

-2
-1
-1

actual output b:

false
true
true

actual output c:

unhashable type: 'list'

however most of the attemps find patterns where one of the 2 values is not in the dataframe column but not if both are not in. there should be some way for a or operator somehow.

Only return true if none of the values is in any row of the dataframe

If i use 111 or 433 not in df then it just thinks all of them don't have the value even if they do have both 1 or none.

edit2: mvce:

df_a = pd.DataFrame({'number': [111, 222, 333, 555]})
df_b = pd.DataFrame({'number': [111, 222, 333, 444]})
df_c = pd.DataFrame({'number': [777, 222, 333, 888]})
print (df_a)
print (df_b)
print (df_c)


print(not(set([111,444]).issubset(set(df_a['number']))))
print(not(set([111,444]).issubset(set(df_b['number']))))
print(not(set([111,444]).issubset(set(df_c['number']))))

result of this:

True
False
True

标签: pythonpandasdataframe

解决方案


df = pd.read_fwf(StringIO("""obj  number
1    433
2    342
3    111
4    345"""))

values1 = [111, 433]
values2 = [111, 433, 222]

print(all([any(df['number'] == v) for v in values1]))
print(all([any(df['number'] == v) for v in values2])

Output:

True
False

推荐阅读