需要布尔切片的帮助

Posted

技术标签:

【中文标题】需要布尔切片的帮助【英文标题】:Need help for boolean slicing 【发布时间】:2017-04-04 06:08:37 【问题描述】:

我有一个数据框。我想根据两列之间的比较进行切片。例如,在下面的示例中,我想提取列 x 大于列 y 的行:

d = pd.DataFrame('x':[1, 2, 3, 4, 5], 'y':[4, 5, 6, 7, 8])

d[d[:"x"]>d[:"y"]]

这样做我得到一个错误:

“不可散列的类型:'sl​​ice'”

【问题讨论】:

【参考方案1】:

您需要省略: 并使用boolean indexing

d[d["x"]>d["y"]]

示例(更改了最后一个值):

d = pd.DataFrame('x':[1, 2, 3, 4, 5], 'y':[4, 5, 6, 7, 3])
print (d)
   x  y
0  1  4
1  2  5
2  3  6
3  4  7
4  5  3

print (d["x"]>d["y"])
0    False
1    False
2    False
3    False
4     True
dtype: bool

print (d[d["x"]>d["y"]])
   x  y
4  5  3

【讨论】:

谢谢。您的答案在上面的示例中有效,但在另一种情况下仍然无效:假设我有一个包含 2 列 A 和 B 的数据框。它们包含字符串。我想提取 A 中的字符串包含在 B 中的那些行。我在 d["B"]] 中使用 d[d["A"],但现在出现如下错误:'Series' 对象是可变的,因此它们不能被散列 谢谢你。命令 d[d["x"].isin(d["y"])]) d0es 不会给我错误。哪个是进步!!! :-) 但仍然没有解决我的问题。我的行是 X 列,比如“abc”,Y 列是“xxxabcxxx”,但是上面的命令没有提取它。为什么? 是的,所以需要d = pd.DataFrame('A':['abc','d','r t','rr','tt'], 'B':['xxxabcxxx','bb','d','tttrrtt','rrtt']) print (d),然后是print (d[d.apply(lambda x: x.A in x.B, axis=1)]) 是的,伙计!有用!!!!但是为什么操作符“in”不起作用呢? 'Series' 对象是可变的,因此它们不能被散列“'Series' 对象是可变的,因此它们不能被散列”是什么意思? 主要问题是pandas使用numpy数组,所以如果需要与in比较需要申请。然后in 用于每行中的比较列 A 和 B - 它必须比较标量。

以上是关于需要布尔切片的帮助的主要内容,如果未能解决你的问题,请参考以下文章

python--pandas切片

需要帮助理解 if 语句中的以下布尔表达式

使用切片布尔索引的熊猫子集

numpy切片和布尔型索引

Python 只有整数、切片...和整数或布尔数组是有效的索引

python 示例2:使用布尔表达式进行multiIndex切片