如果值列表不在数据框列中(每个单个值),则返回true

时间:2019-09-05 12:54:38

标签: python pandas dataframe

输入数据a:

obj  number
1    111
2    222
3    333
4    555

输入数据b:

obj  number
1    111
2    222
3    333
4    444

输入数据c:

obj  number
1    777
2    222
3    333
4    888

预期的输出数据:

false
true
false

尝试:

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

实际输出a:

-2
-1
-1

实际输出b:

false
true
true

实际输出c:

unhashable type: 'list'

但是大多数尝试会找到模式,其中2个值之一不在dataframe列中,但如果两个都不在,则不存在。应该以某种方式为or运算符提供某种方式。

仅在数据框的任何行中都没有值时返回true

如果我在df中不使用111或433,那么即使它们全部为1或都不为空,它只是认为它们都没有值。

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']))))

结果:

True
False
True

3 个答案:

答案 0 :(得分:0)

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])

输出:

True
False

答案 1 :(得分:0)

使用set.isdisjoint

  

如果集合没有与其他集合相同的元素,则返回True。当且仅当它们的交集为空集时,集才是不相交的。

print ((set([111,444]).isdisjoint(set(a['number']))))
False
print ((set([111,444]).isdisjoint(set(b['number']))))
False
print ((set([111,444]).isdisjoint(set(c['number']))))
True

答案 2 :(得分:0)

由于您要对三(3)个不同数据框的每一行进行比较,因此您只需将相关的列添加到一个并在其中进行比较,就可以使用np.where()为结果创建一个新列。

>>> df1 = pd.DataFrame({'obj':[1,2,3,4], 'number':[111,222,333,555]})
>>> df2 = pd.DataFrame({'obj':[1,2,3,4], 'number':[111,222,333,444]})
>>> df3 = pd.DataFrame({'obj':[1,2,3,4], 'number':[777,222,333,888]})
>>> df1
   obj  number
0    1     111
1    2     222
2    3     333
3    4     555
>>> df2
   obj  number
0    1     111
1    2     222
2    3     333
3    4     444
>>> df3
   obj  number
0    1     777
1    2     222
2    3     333
3    4     888

创建列:

>>> df1['num from df2'] = df2['number']
>>> df1['num from df3'] = df3['number']
>>> df1
   obj  number  num from df2  num from df3
0    1     111           111           777
1    2     222           222           222
2    3     333           333           333
3    4     555           444           888

现在使用np.where()进行比较,我相信您所需要的对于返回True都是正确的,因此我们将使用&

>>> df1['Conditon Result'] = np.where((df1['number'] == df1['num from df2']) & (df1['number'] == df1['num from df3']), [True], [False])
>>> df1
   obj  number  num from df2  num from df3  Conditon Result
0    1     111           111           777            False
1    2     222           222           222             True
2    3     333           333           333             True
3    4     555           444           888            False

让我知道这是否有帮助:))。