【问题标题】: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'”

【问题讨论】:

    标签: python pandas indexing boolean conditional-statements


    【解决方案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 - 它必须比较标量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多