熊猫布尔过滤顺序

时间:2018-08-30 12:22:20

标签: python pandas dataframe

我遇到了熊猫的问题。 例如,我有数据框,我想过滤它。

df = pd.DataFrame({'A': [i for i in range(5)], 
                   'B': [i ** 2 for i in range(5)]}) 

df[(df.A > 2) & (df.apply(lambda row: print('call'), axis=1))]

但是为什么会这样呢?为什么第二条语句对所有行都执行?我认为,熊猫可以使用逻辑和(运算符&)按顺序过滤

enter image description here

有人可以解释我吗?如何在一个数据框中使用过滤器而无需重新分配数据框?

2 个答案:

答案 0 :(得分:0)

print返回None,依此类推

df[(df.A > 2) & (df.apply(lambda row: print('call'), axis=1))]

相同
df[(df.A > 2) & pd.Series([None]*5)] 

相同
df[pd.Series([None]*5)]

所有元素都被解释为False,因此您会得到空的DataFrame

答案 1 :(得分:0)

或者您可以这样做:

df.loc[df.A > 2, "isCalled"] = 'called'

对于其他行:

df.loc[~df.A > 2, "isCalled"] = 'not called'