pandas筛选符合多个条件的方法


我的这篇笔记不记录排序、分组、替换,只记录筛选功能的三种常见的方法。

  • 直接筛选(推荐)
  • 基于map方法的筛选(在方法一的基础上,十分推荐)
  • query方法(不推荐)

所有代码均在:https://github.com/123liudong/pythonBlog/tree/master/dataDealPandas

示例数据展示

all_data = pd.read_csv('data.csv')
print(all_data.info())
print(all_data.head(100))

在这里插入图片描述

例子筛选说明

为了简单例子,所以在使用筛选方法1和方法2的时候,直接筛选User_id=1439408和Date=NaN的数据。至于筛选方法3,因为我还不知道怎么表示NaN所以仅展示筛选User_id=1439408的数据。

直接筛选

  • 直接使用列需要满足的条件,如果需要多个列同时满足条件,使用’&‘符号连接即可;如果只需要某一列满足条件,则使用’|'连接多个列的条件。
# # 直接筛选方法
some = all_data[(all_data['User_id'] == 1439408) & (all_data['Date'].isna())]
print(some)

结果:得到了User_id=1439408和Date为空的数据项

   User_id  Merchant_id  Coupon_id Discount_rate  Distance  Date_received  Date
1  1439408         4663    11002.0        150:20       1.0     20160528.0   NaN
2  1439408         2632     8591.0          20:1       0.0     20160217.0   NaN
3  1439408         2632     1078.0          20:1       0.0     20160319.0   NaN
4  1439408         2632     8591.0          20:1       0.0     20160613.0   NaN

基于map的筛选

  • 这个筛选方式和直接筛选唯一不同的就是,把筛选条件给隔离出来了。
user_requried = all_data['User_id'].map(lambda x : x==1439408)
date_requried = all_data['Date'].map(lambda x : np.isnan(x))
some = all_data[user_requried & date_requried]
print(some) 

结果:其中map返回的值必须是bool类型,即某一个条件。然后使用直接筛选的方式,把条件合并,最终得出筛选的结果。我认为使用此种类型的方法更加的优美。

   User_id  Merchant_id  Coupon_id Discount_rate  Distance  Date_received  Date
1  1439408         4663    11002.0        150:20       1.0     20160528.0   NaN
2  1439408         2632     8591.0          20:1       0.0     20160217.0   NaN
3  1439408         2632     1078.0          20:1       0.0     20160319.0   NaN
4  1439408         2632     8591.0          20:1       0.0     20160613.0   NaN

使用query()方法筛选

  • 直接写表达式,得出想要筛选的结果。
some = all_data.query('(User_id == 1439408)')
print(some)

结果:直接写表达式容易触发一些不必要的问题(值的类型容易出错,一些特殊值的表达困难等),所以并不建议使用这样的方法。

   User_id  Merchant_id  Coupon_id  ... Distance  Date_received        Date
0  1439408         2632        NaN  ...      0.0            NaN  20160217.0
1  1439408         4663    11002.0  ...      1.0     20160528.0         NaN
2  1439408         2632     8591.0  ...      0.0     20160217.0         NaN
3  1439408         2632     1078.0  ...      0.0     20160319.0         NaN
4  1439408         2632     8591.0  ...      0.0     20160613.0         NaN
5  1439408         2632        NaN  ...      0.0            NaN  20160516.0
6  1439408         2632     8591.0  ...      0.0     20160516.0  20160613.0

总结:

  • 直接筛选适用于一些较简单的筛选
  • 基于map的方法适用于较为复杂的筛选,把条件提出来实现,使得代码更加简单明了。
  • 使用query方法虽然也能实现,但写的表达式总是容易出错,所以不建议使用。

参考资料

  • https://pandas.pydata.org/pandas-docs/stable/
发布了22 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38727626/article/details/100164430
今日推荐