Python 在列表中查找数字,数字和列表都存储在单元格中

Python 在列表中查找数字,数字和列表都存储在单元格中,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

我想创建另一列“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
中:

"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