0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

pandas筛选数据的8个小技巧

数据分析与开发 来源:Python数据科学 作者:东哥起飞 2021-09-26 11:04 次阅读

日常用Python做数据分析最常用到的就是查询筛选了,按各种条件、各种维度以及组合挑出我们想要的数据,以方便我们分析挖掘。东哥总结了日常查询和筛选常用的种骚操作,供各位学习参考。本文采用sklearnboston数据举例介绍。

fromsklearnimportdatasets
importpandasaspd

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

9f72463a-1114-11ec-8fb8-12bb97331649.png

1. []

第一种是最快捷方便的,直接在dataframe的[]中写筛选的条件或者组合条件。比如下面,想要筛选出大于NOX这变量平均值的所有数据,然后按NOX降序排序。

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

9f8862e4-1114-11ec-8fb8-12bb97331649.png

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

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

9f96c9ba-1114-11ec-8fb8-12bb97331649.png

2. loc/iloc

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

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

9fae84a6-1114-11ec-8fb8-12bb97331649.png

3. isin

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

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

9fbd671e-1114-11ec-8fb8-12bb97331649.png

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

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

9fcf1112-1114-11ec-8fb8-12bb97331649.png

4. str.contains

上面的举例都是数值大小比较的筛选条件,除数值以外当然也有字符串的查询需求pandas里实现字符串的模糊筛选,可以用.str.contains()来实现,有点像在SQL语句里用的是like。下面利用titanic的数据举例,筛选出人名中包含Mrs或者Lily的数据,|或逻辑符号在引号内。

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

9fe358de-1114-11ec-8fb8-12bb97331649.png

.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()

9ff0217c-1114-11ec-8fb8-12bb97331649.png

也可以用other赋给指定值。

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

9ffc2c10-1114-11ec-8fb8-12bb97331649.png

甚至还可以写组合条件。

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

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

a00930cc-1114-11ec-8fb8-12bb97331649.png

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

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

a0174b8a-1114-11ec-8fb8-12bb97331649.png

6. query

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

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

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

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

a02756e2-1114-11ec-8fb8-12bb97331649.png

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的

a052a612-1114-11ec-8fb8-12bb97331649.png

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)

a088f6b8-1114-11ec-8fb8-12bb97331649.png

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

>>>train.isnull().any(axis=1).sum()
>>>708
编辑:jq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    7085

    浏览量

    89220
  • SQL
    SQL
    +关注

    关注

    1

    文章

    768

    浏览量

    44177
  • python
    +关注

    关注

    56

    文章

    4800

    浏览量

    84821

原文标题:pandas 筛选数据的 8 个骚操作

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DAC3283到底是8位的LVDS输入数据还是16位的LVDS输入数据

    请问这个DAC到底是8位的LVDS输入数据还是16位的LVDS输入数据啊。。也就是说,这个I路的15:8和7:0,是一16位
    发表于 12-31 08:27

    如何进行元器件筛选

    电子元件的核心作用在电子设备中,电子元件扮演着基础而关键的角色,它们是电子通信、数据处理和自动化控制等技术领域的基石。筛选的必要性为了确保电子元件在其整个使用寿命内都能稳定工作,避免因元件本身的缺陷
    的头像 发表于 12-19 12:37 191次阅读
    如何进行元器件<b class='flag-5'>筛选</b>?

    Kaggle知识点:使用大模型进行特征筛选

    数据科学数据挖掘的核心是是对海量数据进行有效的筛选和分析。传统上数据筛选依赖于
    的头像 发表于 12-03 01:06 1273次阅读
    Kaggle知识点:使用大模型进行特征<b class='flag-5'>筛选</b>

    ADS131M08采集数据8通道中有个别通道数据不准,为什么?

    您好,我们用ADS131M08这个芯片同时采集数据8通道中有1-2通道采集的数据误差绝对值差别比较大。万用表量了是2.1V左右,但采
    发表于 11-29 11:37

    RAPIDS cuDF将pandas提速近150倍

    在 NVIDIA GTC 2024 上,NVIDIA 宣布,RAPIDS cuDF 当前已能够为 950 万 pandas 用户带来 GPU 加速,且无需修改代码。
    的头像 发表于 11-20 09:52 222次阅读
    RAPIDS cuDF将<b class='flag-5'>pandas</b>提速近150倍

    使用原代肿瘤细胞进行药物筛选的数字微流控系统

    不佳甚至会产生不良反应。临床数据表明,某种药物对癌症的治疗过程有大量基因参与,基于基因的精准医疗难以满足患者需求。从患者活检或肿瘤样本中对原发性肿瘤细胞进行药物筛选可提供关于特定肿瘤药物敏感性的直接信息,但
    的头像 发表于 11-18 10:05 714次阅读
    使用原代肿瘤细胞进行药物<b class='flag-5'>筛选</b>的数字微流控系统

    PCIe实时运动控制卡的双盘视觉筛选机上位机开发应用

    PCIe实时运动控制卡的双盘视觉筛选机上位机开发应用
    的头像 发表于 10-10 10:15 360次阅读
    PCIe实时运动控制卡的双盘视觉<b class='flag-5'>筛选</b>机上位机开发应用

    PCM1865能否通过配置,同时采集4立体声(即8声道)的音频数据

    一片PCM1865,能否通过配置,同时采集4立体声(即8声道)的音频数据
    发表于 09-29 07:32

    pytorch如何训练自己的数据

    pandas matplotlib 数据准备 在训练模型之前,我们需要对数据进行预处理。这包括数据清洗、数据增强、
    的头像 发表于 07-11 10:04 559次阅读

    用STM8做一用于抽取频谱的东西, 如何采样128点用于FFT数据计算?

    各位前辈和大侠们: 想用STM8做一用于抽取频谱的东西, 采用128点的FFT运算, 采样率为16K, 这里就需要一次采样128点用于FFT数据计算. 该如何采样这128
    发表于 05-16 08:10

    stm32串口dma发送数据,发送的数据一直为数组的第一字节81为什么?

    uint8_t tx[8]={1,2,3,4,5,6,7,8}; HAL_UART_Transmit_DMA( huart1, tx, 8); 发送的
    发表于 05-14 06:18

    STM8 UART1只能接收到5个数据中的最后一,为什么?

    instruction. */ } 现在是我上位机发了5个数据入0x01 0x00 0x00 0x00 0x01 然后我Debug模式下看到的变量 ColorData、RData 、GData
    发表于 04-30 07:57

    为什么stm32F407ZET6 CAN1的14-28筛选器不起作用?

    CAN共有28筛选器组,每个筛选器可配置4种模式,分别是132位掩码,232位标识符,2
    发表于 03-21 07:18

    mapgis属性筛选表达式

    MapGIS是一种广泛应用于地理信息系统(GIS)领域的软件平台。它提供了多种功能和工具,用于处理和分析地理数据。属性筛选是MapGIS中一项重要的功能,它允许用户根据特定的属性条件来筛选要素。在这
    的头像 发表于 02-25 10:58 1678次阅读

    M451让串口接收8个字节数据,为什么每次用串口调试工具接收到的数据都是2次RxData数据

    如下面的一段程序,就是让串口接收8个字节数据,然后把它们通过串口发送出去。 uint8_t RxData[8]; uint8_t i = 0
    发表于 01-17 06:44