给定一个 DataFrame df
,如果想将 DataFrame 过滤到 column_4
介于 45 和 48 之间的行,可以尝试以下代码片段:
import pandas as pd
df = pd.DataFrame({f'column_{i}': range(i*10, 10*i+10) for i in range(10)})
df2 = df[45 < df['column_4'] < 48]
然而,这段代码会产生一个 ValueError,因为 The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
而不是必须这样做
import pandas as pd
df = pd.DataFrame({f'column_{i}': range(i*10, 10*i+10) for i in range(10)})
df2 = df[(45 < df['column_4']) & (df['column_4'] < 48)]
为什么会这样 - 这是一种过滤 DataFrame 的黑客方法吗?
这个问题似乎有部分答案 here,但这似乎并没有具体说明为什么 45 < a < 48
不起作用。
答案 0 :(得分:0)
It's already been asked,我只是搜索了错误的术语。
简短的回答是诸如 1 < a < 4
之类的链式关系运算符在内部扩展为 (1 < a) and (a < 4)
。 and
和 or
不能在 Python 中被覆盖——参见 PEP335 和 guido's post to the mailing list——这意味着 numpy 不能使用链式关系运算符作为掩码。因此,熊猫也不能。