Python 在列表中查找数字,数字和列表都存储在单元格中
我想创建另一列“Isin”,如果每行的“列表”字段中有“编号”,则该列设置为1Python 在列表中查找数字,数字和列表都存储在单元格中,python,list,pandas,Python,List,Pandas,我想创建另一列“Isin”,如果每行的“列表”字段中有“编号”,则该列设置为1 df = DataFrame({'Number': (1, 3, 4, 5), 'Lists': ([1], [3, 4, 5], [6, 7], [8])}) 我已经尝试了很多东西,都是基于df['Number'].isin(df['Lists'])。。。没有任何运气!它以不可损坏的类型失败:“list”您可以使用apply()函数在行中循环,并逐行检查Number是否在list
df = DataFrame({'Number': (1, 3, 4, 5),
'Lists': ([1], [3, 4, 5], [6, 7], [8])})
我已经尝试了很多东西,都是基于df['Number'].isin(df['Lists'])
。。。没有任何运气!它以不可损坏的类型失败:“list”您可以使用apply()
函数在行中循环,并逐行检查Number
是否在list
中:
"Isin"
1
1
0
0
选项1使用快速numpy方法
df["Isin"] = df.apply(lambda r: int(r.Number in r.Lists), axis=1)
选项2创意拉链
def box(v):
lens = np.array([len(item) for item in v])
mask = lens[:,None] > np.arange(lens.max())
out = np.full(mask.shape, np.nan)
out[mask] = np.concatenate(v)
return out
df['Isin'] = (box(df.Lists.tolist()) == df.Number.values[:, None]).any(1) * 1
f = lambda x: 1 if set.intersection(*map(set, x)) else 0
df['Isin'] = [f(t) for t in zip(df.Lists.values.tolist(),
df.Number.values[:, None].tolist())]
df