[Pandas]Dataframe中的多条件切片为什么不能使用and运算符

对于Dataframe中同一列,如果有多个条件,则不能使用and运算符,需要使用&位运算符。示例如下:

import pandas as pd
df = pd.DataFrame({'name':['a','a','b','b'],'classes':[1,2,3,4],'price':[11,22,33,44]})
print(df[(df['price']>11) and (df['price']<44)])

如果需要找到价格在20到40之间的行,则使用上述代码编译器报如下错误:

   Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Users/wangxxin/miniconda3/lib/python3.7/site-packages/pandas/core/generic.py", line 1576, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

报错的大概意思就是值是模棱两可,不清晰的,系统无法处理。
这个时间,如果把上述最后一句代码调整为:

df.loc[(df['price']>11) & (df['price']<44)]
#就可以输出正确的内容,如下表示:
      name  classes  price
1    a        2     22
2    b        3     33

那么疑问来了,为什么使用and会报错,而使用&不会报错呢?
这个时候需要回归问题的本质:and与&到底有什么区别?
1、and是python中的逻辑运算符;
2、&是python中的位运算符;
例如:
你可以使用and来表示:1 and 2 =2
但是如果二进制的位运算,则是and无法胜算的

#a=60,二进制数为:0011 1100
a = 0b111100
#b=13,二进制数为:0000 1101
b=0b1101
#a&b,按位运算,应该为:0000 1100,bn 也就是下面的值:12
a&b
12

好了,理解完and与&的区别,后,我们再来看

df[(df['price']>11) and (df['price']<44)]

df.loc[(df['price']>11) & (df['price']<44)]

的区别。直接看还是有点不清楚的,再看df[‘price’]>11打印出来看一下,也许就清晰了,结果如下:

df['price']>11
0    False
1     True
2     True
3     True
Name: price, dtype: bool

这样就一目了然了,因为他的值并不是一个数值,而是一个seriers,需要进行按位运算的,所以只能使用&,而不能使用and运算符。

PandasDataFrame是一个二维标签数据结构,你可以使用多种方法进行数据筛选。以下是几种常见的筛选方法: 1. 使用`loc`和`iloc`: - `loc`用于基于标签的索引,它可以根据行标签和列标签来进行数据筛选。 ```python df.loc[row_indexer, column_indexer] # 行标签和列标签 ``` - `iloc`用于基于整数的索引,它通过行号和列号来选择数据。 ```python df.iloc[row_indexer, column_indexer] # 行号和列号 ``` 2. 使用布尔索引: - 布尔索引是一种非常灵活的筛选方式,你可以创建一个布尔数组来表示每一行是否满足特定条件。 ```python df[df['column_name'] > some_value] # 根据列值筛选满足条件的行 ``` 3. 使用条件组合: - Pandas支持使用`&`(和)和`|`(或)运算符来组合多个条件。 ```python df[(df['column1'] > value1) & (df['column2'] < value2)] # 多个条件组合筛选 ``` 4. 使用`.query()`方法: - 这是一种简洁的筛选方法,允许你使用字符串形式的查询表达式来进行筛选。 ```python df.query('column1 > @value1 and column2 < @value2') # 使用字符串形式的查询表达式 ``` 5. 使用`.drop()`和`.keep()`方法: - 你可以使用`drop`方法根据标签删除某些行或列,而`keep`方法则用于指定保留哪些行或列。 ```python df.drop(labels, axis=0, inplace=False) # 删除行 df.drop(labels, axis=1, inplace=False) # 删除列 df.keep(labels, axis=0, inplace=False) # 保留行 df.keep(labels, axis=1, inplace=False) # 保留列 ``` 6. 使用切片: - 类似于Python列表,你也可以对DataFrame进行切片操作,这会返回部分数据的视图。 ```python df[start:stop:step] # 行切片 df[column_start:column_stop:column_step] # 列切片 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值