Python 在数据帧上应用np.isin()时出现意外行为

Python 在数据帧上应用np.isin()时出现意外行为,python,pandas,numpy,Python,Pandas,Numpy,在工作中,我偶然发现了一个意想不到的行为: 考虑以下数据帧: df=pd.DataFrame({ “A”:列表('AAcdef'), ‘B’:[4,5,4,5,5,4], “E”:[5,3,6,9,2,4], “F”:列表('BaaBbA') }) 打印(df) abef 因为 适用于pd.系列,不适用 返回一个pd.Series 要将pd.Series转换为类似数组的格式,您的x.values.tolist()应该可以工作 我认为在DataFrame中,数字和整数是混合的,所以如果按行循环使

在工作中,我偶然发现了一个意想不到的行为:

考虑以下数据帧:

df=pd.DataFrame({
“A”:列表('AAcdef'),
‘B’:[4,5,4,5,5,4],
“E”:[5,3,6,9,2,4],
“F”:列表('BaaBbA')
})
打印(df)
abef
因为

  • 适用于pd.系列
  • ,不适用
  • 返回一个
    pd.Series
  • 要将
    pd.Series
    转换为类似数组的格式,您的
    x.values.tolist()
    应该可以工作

  • 我认为在DataFrame中,数字和整数是混合的,所以如果按行循环使用混合类型获得
    Series
    ,那么numpy强制使用
    字符串

    可能的解决方案是先转换为数组,然后再转换为
    cond
    中的
    string
    值:

    cond = [[4],[5]]
    
    print(df.apply(lambda x: np.isin(np.array(cond).astype(str), x.values.tolist()).all(),axis=1))
    0     True
    1    False
    2    False
    3    False
    4    False
    5    False
    dtype: bool
    
    不幸的是,对于通用解决方案(如果可能,仅数字列),需要同时转换-
    cond
    Series

    f = lambda x: np.isin(np.array(cond).astype(str), x.astype(str).tolist()).all()
    print (df.apply(f, axis=1))
    
    或所有数据:

    f = lambda x: np.isin(np.array(cond).astype(str), x.tolist()).all()
    print (df.astype(str).apply(f, axis=1))
    
    如果在纯python中使用set,那么它工作起来很好:

    print(df.apply(lambda x: set([4,5]).issubset(x),axis=1) )
    0     True
    1    False
    2    False
    3    False
    4    False
    5    False
    dtype: bool
    
    print(df.apply(lambda x: set(['A',5]).issubset(x),axis=1) )
    0     True
    1     True
    2    False
    3    False
    4    False
    5    False
    dtype: bool
    

    有趣的是,如果
    cond=[[4],[5]]
    ,即两者都是整数,则
    .values.tolist()
    方法会失败,请参见上面的编辑。因此,我想关键是您的
    [df.isin(x)。cond中x的any(1)
    -解决方案会在每列中的每行项目上迭代,因此它会为每个数据帧元素推断出“正确的”
    dtype
    ,这样可以确保有效的比较,而我的尝试是逐行迭代的,因此“升级”
    int
    string
    ,对吗?@Asmus-有一个很难解决的问题,就像它在内部工作一样。但是在列表中,理解是迭代
    cond
    中的每个值。啊,如果您只运行
    print([(x,df.loc[0].isin(x))for x in cond])
    您可以看到它为每个元素创建布尔值,这就是为什么您需要
    逻辑和.reduce
    它。这就是为什么你的代码比我的好用。顺便说一下,你的<代码> SET()>代码>解决方案要好多了,你应该考虑把它放进@ ASMU-我像你想要的那样替换它:)asMUS-现在回来了: