gpt4 book ai didi

python - .drop() 的 Pandas bool 索引错误

转载 作者:行者123 更新时间:2023-11-28 21:41:12 26 4
gpt4 key购买 nike

我正试图摆脱在 Pandas 中使用链式赋值。虽然我发现这种行为是为了更新我的作业实践,但我认为它与作业本身无关。如下例所示,似乎是过滤过程本身。这似乎是一个错误...但也许我遗漏了什么?

df = pd.DataFrame( data = {
'acol' : [1.0, 3.00, 11.0, 31.0, 100.0, 314.0],
'bcol' : [1.0, 3.14, 10.1, 31.4, 81.2, 314.1]
})

我的旧方法是过滤和重新分配,有条件地保留一些行:

In[20]: df[(df.acol > df.bcol) & (df.acol > 10)]

Out[20]:
acol bcol
2 11.0 10.1
4 100.0 81.2

新的、更负责任的我正在尝试使用 .drop() 函数......但结果似乎不一致:

In[21]: df.drop((df.acol <= df.bcol) | (df.acol <= 10), axis=0)
Out[21]:
acol bcol
2 11.0 10.1
3 31.0 31.4
4 100.0 81.2
5 314.0 314.1

De Morgan 定理说这些应该给出相同的结果 (https://en.wikipedia.org/wiki/De_Morgan%27s_laws)。

我已经检查了文档 ( http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing ),但似乎没有提到这种行为。我知道数据帧索引中存在一些歧义,但通过使用按位运算符,我应该避免这种情况 ( Pandas boolean DataFrame selection ambiguity )。

更令人担忧的是,如果我从输入数据的每个列表中删除第零个条目,我在使用 .drop() 时会得到不同的结果(第 2 行消失)!

我正在使用 Python 3.6,Pandas 0.20.2

暂停?

最佳答案

你需要boolean indexing使用 df.index 然后是 drop :

print (df.index[((df.acol <= df.bcol) | (df.acol <= 10))])
Int64Index([0, 1, 3, 5], dtype='int64')

df1 = df.drop(df.index[((df.acol <= df.bcol) | (df.acol <= 10))])
print (df1)
acol bcol
2 11.0 10.1
4 100.0 81.2

在您的代码中:

df.drop((df.acol <= df.bcol) | (df.acol <= 10))

是转换为 01 的 bool 掩码,因此第一行和第二行被删除。

print ((df.acol <= df.bcol) | (df.acol <= 10))
0 True
1 True
2 False
3 True
4 False
5 True
dtype: bool

所以在我看来,使用 drop 是有点过于复杂的解决方案,更好的做法是使用 boolean indexing仅:

df[(df.acol > df.bcol) & (df.acol > 10)]

或使用 query 的替代解决方案:

df1 = df.query("acol > bcol & acol > 10")
print (df1)
acol bcol
2 11.0 10.1
4 100.0 81.2

关于python - .drop() 的 Pandas bool 索引错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com