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-现在回来了: