Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查一列的值是否在另一个numpy数组列的值中_Python_Pandas - Fatal编程技术网

Python 检查一列的值是否在另一个numpy数组列的值中

Python 检查一列的值是否在另一个numpy数组列的值中,python,pandas,Python,Pandas,我有一个熊猫数据框 import pandas as pd dt = pd.DataFrame({'id' : ['a', 'a', 'a', 'b', 'b'], 'col_a': [1,2,3,1,2], 'col_b': [2,2,[2,3],4,[2,3]]}) 我想创建一个列来评估a列中的值是否在b列中 输出数据帧应如下所示: dt = pd.DataFrame({'id' : ['a', 'a', 'a',

我有一个熊猫数据框

import pandas as pd
dt = pd.DataFrame({'id' : ['a', 'a', 'a', 'b', 'b'],
                   'col_a': [1,2,3,1,2],
                   'col_b': [2,2,[2,3],4,[2,3]]})
我想创建一个列来评估a列中的值是否在b列中

输出数据帧应如下所示:

dt = pd.DataFrame({'id' : ['a', 'a', 'a', 'b', 'b'],
                   'col_a': [1,2,3,1,2],
                   'col_b': [2,2,[2,3],4,[2,3]],
                   'exists': [0,1,1,0,1]})

我该怎么做呢?

解决方案如果需要每行测试值,这意味着不是列cola的每个值都被列colu_b的所有值所取代:

您可以将自定义函数与if else语句一起使用:

f = lambda x: x['col_a'] in x['col_b'] 
              if isinstance(x['col_b'], list) 
              else x['col_a']== x['col_b']
dt['e'] = dt.apply(f, axis=1).astype(int)
print (dt)
  id  col_a   col_b  exists  e
0  a      1       2       0  0
1  a      2       2       1  1
2  a      3  [2, 3]       1  1
3  b      1       4       0  0
4  b      2  [2, 3]       1  1
或者,比较两个列,然后对每个索引值至少测试一个True:

dt['e'] = dt.explode('col_b').eval('col_a == col_b').any(level=0).astype(int)
print (dt)
  id  col_a   col_b  exists  e
0  a      1       2       0  0
1  a      2       2       1  1
2  a      3  [2, 3]       1  1
3  b      1       4       0  0
4  b      2  [2, 3]       1  1

解决方案如果需要每行的测试值,则表示不是列cola_a的每个值与列colu_b的所有值之比:

您可以将自定义函数与if else语句一起使用:

f = lambda x: x['col_a'] in x['col_b'] 
              if isinstance(x['col_b'], list) 
              else x['col_a']== x['col_b']
dt['e'] = dt.apply(f, axis=1).astype(int)
print (dt)
  id  col_a   col_b  exists  e
0  a      1       2       0  0
1  a      2       2       1  1
2  a      3  [2, 3]       1  1
3  b      1       4       0  0
4  b      2  [2, 3]       1  1
或者,比较两个列,然后对每个索引值至少测试一个True:

dt['e'] = dt.explode('col_b').eval('col_a == col_b').any(level=0).astype(int)
print (dt)
  id  col_a   col_b  exists  e
0  a      1       2       0  0
1  a      2       2       1  1
2  a      3  [2, 3]       1  1
3  b      1       4       0  0
4  b      2  [2, 3]       1  1
您可以使用:

dt[exists]=dt.col_a.isindt.col_b.explode.astypeint 分解包含列的列表并检查列是否在其中。最后转换为int

得到

>>> dt
  id  col_a   col_b  exists
0  a      1       2       0
1  a      2       2       1
2  a      3  [2, 3]       1
3  b      1       4       0
4  b      2  [2, 3]       1 
如果需要逐行比较,可以使用:

dt[exists]=dt.col_a.eqdt.col_b.explode.groupbylevel=0.any.astypeint 它按行检查相等性,如果任何分组的分解值为True,则表示它存在。

您可以使用:

dt[exists]=dt.col_a.isindt.col_b.explode.astypeint 分解包含列的列表并检查列是否在其中。最后转换为int

得到

>>> dt
  id  col_a   col_b  exists
0  a      1       2       0
1  a      2       2       1
2  a      3  [2, 3]       1
3  b      1       4       0
4  b      2  [2, 3]       1 
如果需要逐行比较,可以使用:

dt[exists]=dt.col_a.eqdt.col_b.explode.groupbylevel=0.any.astypeint
它按行检查相等性,如果任何分组的分解值为真,我们就说它存在。

解决方案是错误的,如果OP需要按行测试,只处理样本数据,请尝试“col_b”:[2,2,[2,3],4,[20,30],@jezrael谢谢,我为严格的行包含情况添加了一行。解决方案是错误的,如果OP需要按行测试,只处理示例数据,请尝试“col_b”:[2,2,[2,3],4,[20,30]],@jezrael谢谢,我为严格的行包含大小写添加了一行。如果数据是“col_b”:[2,2,[2,3],4,[20,30]],那么最后一个值是False还是True?您需要按行进行测试?它应该是false,然后如果数据是'colu_b':[2,2,3,4,20,30],那么最后一个值是false还是True?您需要按行进行测试?那么应该为false