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