python contains类似函数_【Python代替Excel】6:按条件筛选

准备工作:下载示例数据,提取码:tkqn 数据例子

cf697ebdbd9b5da48de2e3c2d7df42dd.png
数据预览

在Excel中,有个筛选的功能,可以根据条件,去筛选想要的数据,之后想删除、想修改、想添加文字,等等都比较方便。在Python中也可以根据条件,去筛选数据。


找出购买金额最多的用户

上篇文章求出购买金额最多的用户ID是A3OXHLG6DIBRW8,

73b895f9bcd9312c744bc7d7e4e1c3c9.png

根据用户ID,筛选出这名用户的所有订单:

most_sale_user = amazon_data[amazon_data['UserId']=='A3OXHLG6DIBRW8']   #购买金额最多的用户 订单

121ce7fedf088dcb53a21ed8166d4ef6.png

这个most_sale_user也是一个dataframe结构,可以对它进行后续的处理,如统计、修改等等。

这个amazon_data['UserId']=='A3OXHLG6DIBRW8'是长这样的:

1061ba4e5ee5791bf808d31a4d05ba21.png

然后再用 amazon_data[amazon_data['UserId']=='A3OXHLG6DIBRW8']去求出等于True的记录。

上面是知道购买最多的用户是A3OXHLG6DIBRW8的情况下,进行的筛选。如果一个新的数据,我并不想先查看哪个最多,想一次性就求出most_sale_user怎么办呢?

前提是有了用户购买金额的分组,也就是:

user_sales = amazon_data.groupby('UserId')['price(yuan)'].sum().sort_values(ascending=False)  #每个用户的成交金额

e8dc6b4f23e1d303964035bf98c4c59a.png

user_sales是一个Series结构,左边是索引,UserId,右边是索引对应的数值。user_sales是按照购买金额降序排列的,第一个记录就是购买金额第一名的用户。那么直接找到第一个记录的索引,也就找到了购买最多的用户ID。

e3ae9818ac943521598adb0ff8397240.png

user_sales.index,得到它的所有索引值,即用户ID。user_sales.index[0]就是索引值的第一个。

most_sale_user_0 = amazon_data[amazon_data['UserId']=='A3OXHLG6DIBRW8']   #购买金额最多的用户 订单
most_sale_user_1 = amazon_data[amazon_data['UserId']==user_sales.index[0]]   #购买金额最多的用户 订单  等同于上一句

这两句话是同等的,只不过后一句更有灵活性,如果换了一批订单数据,后一句仍旧可以使用。

找出大于均价的订单

上一篇文章,已经求出了订单均价,也就是52.19元:

99f4fa173f16ca9caf885f8726cdedb6.png

与上一个找最高金额用户的方式一样,可以直接使用 52.19,但是灵活性低。(写代码一定要注意灵活性和重复使用性,这也是为什么需要写自定义函数的原因,传入不同的数据,可以得到相同的处理步骤。)

greater_mean_0 = amazon_data[amazon_data['price(yuan)']>=52.19]
greater_mean_1 = amazon_data[amazon_data['price(yuan)']>=amazon_data['price(yuan)'].mean()]

91b71f1da493e9335b275ee2a7a082f2.png
得到价格大于均值的订单

按条件赋值

比如,新增一列叫“类别”,用来判断订单价格是否大于均价。这就涉及到:先筛选出大于均值、小于均值的两组记录,再分别赋值:大于均值、小于均值。

amazon_data.loc[amazon_data['price(yuan)']>=amazon_data['price(yuan)'].mean(),'类别'] = '大于均值'

789dc8fa8b0fe8878c11cb086d945e4d.png

于是得到了新的一列【类别】,里面大于均值的订单,都已经赋值了。那么小于均值的,就有两种方法:

amazon_data.loc[amazon_data['price(yuan)']<amazon_data['price(yuan)'].mean(),'类别'] = '小于均值'  #按小于均值填写
amazon_data['类别'].fillna('小于均值',inplace=True)   #填充空值,要inplace=True,否则不会改变

对,就是将【类别】列填充空值,因为就正反两个选项嘛,大于均值,剩下的就是小于均值了。

别小看这个,如果条件多的时候就很方便了,比如好几个条件,=a的填一个,=b的填一个,=c的填一个,剩下的填一个。如果用条件的话,剩下的还得限制 不等于a且不等于b且不等于c,直接用一个填充空值就可以了。

找出某几个用户的订单

比如某几名用户被技术判断为风险用户,需要人工筛选出他们的订单,并判断是否有风险。假如要找出【A3SGXH7AUHU8GW,A1D87F6ZCVE5NK,ABXLMWJIXXAIN,A395BORC6FGVXV】这四名用户的订单:

danger_user = ['A3SGXH7AUHU8GW','A1D87F6ZCVE5NK','ABXLMWJIXXAIN','A395BORC6FGVXV']  #将用户存入list里
danger_order = amazon_data[amazon_data['UserId'].isin(danger_user)]  #找出他们的订单  isin()

d8709be1f82d67d9b6ab9eb5d9cf91fb.png

同样可以用.isin() 找出某些城市、某些商品等等。

找出 9月-10月 的订单

之前已经处理过,将字符串格式改成了时间格式:

be3f4e6bf60aabe645639863973ce017.png

a053de288236290f95f0355669b45496.png

现在要找出2018.9.1-2018.10.31期间的订单:

date_range_order = amazon_data[(amazon_data['日期date']>='2018-09-01')&(amazon_data['日期date']<'2018-11-01')]
#   & 代表与, | 代表或

找出包含“good”评价的订单

c6d68e0a13c8744d3e2d5e0cbb90e8b5.png
good_order = amazon_data[amazon_data['Text'].str.contains('good')]

448977d19540ffda3b6c5b2c266956e5.png

那么如何找出包含 good或great的呢?很简单,求或;如何找出不包含good的呢?取反。

good_great_order = amazon_data[amazon_data['Text'].str.contains('good|great')]  #good 或 great
no_good_order = amazon_data[~amazon_data['Text'].str.contains('good')]  #不包含good  没错,前面加一个小波浪就是取反

不同的列,也可以添加条件

比如,要找时间在9月之后的,评价包含good的,全部框在一起就行了

order = amazon_data[(amazon_data['Text'].str.contains('good|great'))&(amazon_data['日期date']>='2018-09-01')]

专栏列表

数据分析与Python:【Python代替Excel】1:Python与Anaconda

数据分析与Python:【Python代替Excel】2:数据的读取

数据分析与Python:【Python代替Excel】3:数据的预览

数据分析与Python:【Python代替Excel】4:数据的清洗

数据分析与Python:【Python代替Excel】5:数据的统计分析

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值