pandas:数据筛选的8个操作

文章来源于 公众号 Python数据科学的文章pandas 筛选数据的 8 个骚操作,是个很不错的系列,感兴趣的同学可以移步去学习。

数据分析最常用到的就是查询筛选,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘,这里总结了日常查询和筛选常用的操作。

本文采用sklearnboston数据举例介绍。

from sklearn import datasets
import pandas as pd

boston = datasets.load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)

1. [ ]

第一种是最快捷方便的,直接在dataframe的[]中写筛选的条件或者组合条件。

比如,想要筛选出大于NOX这变量平均值的所有数据,然后按NOX降序排序。

df[df['NOX']>df['NOX'].mean()].sort_values(by='NOX',ascending=False).head()

 也可以使用组合条件,条件之间使用逻辑符号& |等。比如下面这个例子除了上面条件外再加上且条件CHAS为1,注意逻辑符号分开的条件要用()隔开。

df[(df['NOX']>df['NOX'].mean()) & (df['CHAS'] ==1)].sort_values(by='NOX',ascending=False).head()

2. loc/iloc

[]之外,loc/iloc应该是最常用的两种查询方法了。loc按标签值(列名和行索引取值)访问,iloc按数字索引访问,均支持单值访问或切片查询。除了可以像[]按条件筛选数据以外,loc还可以指定返回的列变量,从行和列两个维度筛选。

比如下面这个例子,按条件筛选出数据,并筛选出指定变量,然后赋值。

df.loc[(df['NOX']>df['NOX'].mean()),['CHAS']] = 2

 3. isin

上面我们筛选条件< > == !=都是个范围,但很多时候是需要锁定某些具体的值的,这时候就需要isin了。比如我们要限定NOX取值只能为0.538,0.713,0.437中时。

df.loc[df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

 当然,也可以做取反操作,在筛选条件前加~符号即可。

df.loc[~df['NOX'].isin([0.538,0.713,0.437]),:].sample(5)

 4. str.contains

上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求pandas里实现字符串的模糊筛选,可以用.str.contains()来实现,有点像在SQL语句里用的是like

下面利用titanic的数据举例,筛选出人名中包含Mrs或者Lily的数据,|或逻辑符号在引号内。

train.loc[train['Name'].str.contains('Mrs|Lily'),:].head()

 .str.contains()中还可以设置正则化筛选逻辑。

  • case=True:使用case指定区分大小写

  • na=True:就表示把有NAN的转换为布尔值True

  • flags=re.IGNORECASE:标志传递到re模块,例如re.IGNORECASE

  • regex=True:regex :如果为True,则假定第一个字符串是正则表达式,否则还是字符串

5. where/mask

在SQL里,我们知道where的功能是要把满足条件的筛选出来。pandas中where也是筛选,但用法稍有不同。

where接受的条件需要是布尔类型如果不满足匹配条件,就被赋值为默认的NaN或其他指定值。举例如下,将Sexmale当作筛选条件,cond就是一列布尔型的Series,非male的值就都被赋值为默认的NaN空值了。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, inplace=True)
train.head()

 也可以用other赋给指定值。

cond = train['Sex'] == 'male'
train['Sex'].where(cond, other='FEMALE', inplace=True)

 还可以写组合条件。

train['quality'] = ''
cond1 = train['Sex'] == 'male'
cond2 = train['Age'] > 25

train['quality'].where(cond1 & cond2, other='低质量男性', inplace=True)

 maskwhere是一对操作,与where正好反过来。

train['quality'].mask(cond1 & cond2, other='低质量男性', inplace=True)

 6. query

这是一种非常优雅的筛选数据方式。所有的筛选操作都在''之内完成。

# 常用方式
train[train.Age > 25]
# query方式
train.query('Age > 25')

上面的两种方式效果上是一样的。再比如复杂点的,加入上面的str.contains用法的组合条件,注意条件里有''时,两边要用""包住。

train.query("Name.str.contains('William') & Age > 25")

 在query里还可以通过@来设定变量。

name = 'William'
train.query("Name.str.contains(@name)")

7. filter

filter是另外一个独特的筛选功能。filter不筛选具体数据,而是筛选特定的行或列。它支持三种筛选方式:

  • items:固定列名

  • regex:正则表达式

  • like:以及模糊查询

  • axis:控制是行index或列columns的查询

train.filter(items=['Age', 'Sex'])

train.filter(regex='S', axis=1) # 列名包含S的

 

train.filter(like='2', axis=0) # 索引中有2的

train.filter(regex='^2', axis=0).filter(like='S', axis=1)

 

 8. any/all

any方法意思是,如果至少有一个值为True结果便为Trueall需要所有值为True结果才为True,比如下面这样。

>> train['Cabin'].all()
>> False
>> train['Cabin'].any()
>> True

anyall一般是需要和其它操作配合使用的,比如查看每列的空值情况。

train.isnull().any(axis=0)

 再比如查看含有空值的行数。

>>> train.isnull().any(axis=1).sum()
>>> 708

### 回答1: 在 Pandas ,你可以使用 `~` 操作符来反向筛选数据。例如: ``` import pandas as pd df = pd.DataFrame({'A': [1, 2, 3, 4], 'B': [True, False, True, False]}) # 反向筛选出所有 B 列为 False 的行 result = df[~df['B']] print(result) ``` 输出: ``` A B 1 2 False 3 4 False ``` ### 回答2: 在pandas,我们可以使用"~"运算符来进行反向筛选数据。"~"运算符可以应用于布尔条件,将其翻转。 假设我们有一个DataFrame对象df,其包含了一列名为"age"的年龄数据。我们想要筛选出年龄不等于25的所有行数据。可以使用如下代码: filtered_data = df[~(df['age'] == 25)] 首先,我们使用df['age'] == 25创建了一个布尔条件,该条件返回True表示年龄等于25的行。然后,在布尔条件外加上"~"运算符,实现翻转。最后,将该布尔条件传递给df[]操作符,从而将筛选后的数据返回给filtered_data。 另外,我们也可以使用loc[]方法来实现反向筛选数据。使用loc[]方法的好处是可以同时选择行和列。例如,使用以下代码可以实现相同的目标: filtered_data = df.loc[~(df['age'] == 25), :] 在loc[]方法,我们使用布尔条件作为行索引,":"表示选择所有列。再次,在布尔条件之前添加"~"运算符实现反向筛选。 无论选择哪种方法,都可以通过使用"~"运算符来反向筛选pandas数据。 ### 回答3: 在Pandas,可以使用~(波浪线)来实现反向筛选数据操作。具体步骤如下: 首先,我们需要根据特定的条件进行数据筛选。例如,我们有一个名为df的DataFrame,并且我们希望筛选出其某一列满足特定条件的数据。 可以使用语法df[column_name] < condition来实现条件筛选,其column_name是列名,condition是满足的条件。 接下来,我们可以使用~运算符来反向筛选数据。只需在条件前面加上~即可。 例如,我们可以使用以下语法来反向筛选出df某列不满足特定条件的数据: filtered_data = df[~(df[column_name] < condition)] 这将返回一个新的DataFrame对象filtered_data,其包含不满足条件的数据。 需要注意的是,波浪线~必须放在整个条件的外部,以确保正确的逻辑运算顺序。 使用这种方法,我们可以方便地对数据进行反向筛选,得到我们所需的结果。通过修改条件以及列名,可以在实际应用灵活使用此方法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值