检查Python数据帧中的列表是否包含特定值,同时忽略NAN

检查Python数据帧中的列表是否包含特定值,同时忽略NAN,python,pandas,list,Python,Pandas,List,假设我的dataframe的第二列包含整数列表: df = pd.DataFrame({"col_1":[1,2,3,4,5],"col_2":[[1,2],np.nan,[3,5,9],[2],[8,5]],"col_3":np.nan}) 输出: col_1 col_2 col_3 0 1 [1, 2] NaN 1 2 NaN NaN 2 3 [3, 5, 9] NaN 3 4

假设我的dataframe的第二列包含整数列表:

df = pd.DataFrame({"col_1":[1,2,3,4,5],"col_2":[[1,2],np.nan,[3,5,9],[2],[8,5]],"col_3":np.nan})
输出:

   col_1      col_2  col_3
0      1     [1, 2]    NaN
1      2        NaN    NaN
2      3  [3, 5, 9]    NaN
3      4        [2]    NaN
4      5     [8, 5]    NaN
如果第1列中的int可以在第2列的int列表中找到,我想在第3列中插入1:

   col_1      col_2  col_3
0      1     [1, 2]    1
1      2        NaN    NaN
2      3  [3, 5, 9]    1
3      4        [2]    NaN
4      5     [8, 5]    1
我试图这样解决它:

for i in range(0,len(df)):
    if df["col_1"][i] in df["col_2"][i]:
        df["col_3"][i]=1
这给了我TypeError:类型为“float”的参数是不可iterable的,因为第2列中有NaN,我无法找到处理它的方法

我尝试使用基于.isin的不同解决方案来解决此问题,但这不起作用,因为AttributeError:'list'对象没有属性'isin'

然后我想到用0替换colu 2中的所有NaN,这样我的初始for循环就可以运行了。列1中没有0,也永远不会有,所以我对该解决方案没有意见,因为这不会导致列3中的错误匹配。为此,

df.loc[df["col_2"].isnull(), "col_2"] = 0
这是不够的,因为if-in无法处理int:TypeError:类型为“int”的参数不可iterable。我需要将0 do作为列表的一个元素插入,但不能只使用=[0]。我尝试了基于.at的不同方法,因为它应该能够将列表插入单元格,但我无法计算出来


提前感谢您的建议

您可以使用if-else和x['col\u 2']==x['col\u 2']过滤掉NaN,因为NaN!=NaN为False,Alsof或convert Trues values to 1由字典映射使用,False值不在dict中,因此返回NaN:

或用于删除NAN行,并在添加新列后重新分配新列删除NAN:

使用


非常感谢你@jezrael,这对我来说就像魔术一样。考虑到我的python级别,您的第二个建议直观地对我来说更有意义,但我仍然使用第一个建议,因为它也适用于col_2不包含任何值的情况。我不知道我有这些案例,我有20个这样的专栏,但多亏了你的代码。非常感谢你的时间@WeNYoBen。您的解决方案非常有效,即使每列超过一百万行,也能立即产生效果,但我选择了jezrael的解决方案,因为该解决方案更容易修改一系列列的循环。我没有实际使用col_2,而是从另一个数据帧插入列的标题:df[strcols[titles][I]],然后在is中循环。仍然:非常感谢!
f = lambda x: x['col_1'] in x['col_2'] if x['col_2'] == x['col_2'] else np.nan
df['col_3'] = df.apply(f, 1).map({True:1})
print (df)
   col_1      col_2  col_3
0      1     [1, 2]    1.0
1      2        NaN    NaN
2      3  [3, 5, 9]    1.0
3      4        [2]    NaN
4      5     [8, 5]    1.0
f = lambda x: x['col_1'] in x['col_2']
df['col_3'] = df.dropna(subset=['col_1', 'col_2']).apply(f, 1).map({True:1})
print (df)
   col_1      col_2  col_3
0      1     [1, 2]    1.0
1      2        NaN    NaN
2      3  [3, 5, 9]    1.0
3      4        [2]    NaN
4      5     [8, 5]    1.0
s=df.dropna(subset=['col_2','col_1'])
df['new']=pd.DataFrame(s.col_2.tolist(),index=s.index).isin(df.col_1).sum(1).loc[lambda x : x!=0]
df
   col_1      col_2  col_3  new
0      1     [1, 2]    NaN  1.0
1      2        NaN    NaN  NaN
2      3  [3, 5, 9]    NaN  1.0
3      4        [2]    NaN  NaN
4      5     [8, 5]    NaN  1.0