需要布尔切片的帮助
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"]]
这样做我得到一个错误:
“不可散列的类型:'slice'”
【问题讨论】:
【参考方案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 - 它必须比较标量。以上是关于需要布尔切片的帮助的主要内容,如果未能解决你的问题,请参考以下文章