准备工作:下载示例数据,提取码:tkqn 数据例子
![cf697ebdbd9b5da48de2e3c2d7df42dd.png](https://i-blog.csdnimg.cn/blog_migrate/c270bab5fcad44567a14a1d2e5b1f7d8.jpeg)
在Excel中,有个筛选的功能,可以根据条件,去筛选想要的数据,之后想删除、想修改、想添加文字,等等都比较方便。在Python中也可以根据条件,去筛选数据。
找出购买金额最多的用户
上篇文章求出购买金额最多的用户ID是A3OXHLG6DIBRW8,
![73b895f9bcd9312c744bc7d7e4e1c3c9.png](https://i-blog.csdnimg.cn/blog_migrate/9949bf22bc35c39956fd1ccb5024fd41.jpeg)
根据用户ID,筛选出这名用户的所有订单:
most_sale_user = amazon_data[amazon_data['UserId']=='A3OXHLG6DIBRW8'] #购买金额最多的用户 订单
![121ce7fedf088dcb53a21ed8166d4ef6.png](https://i-blog.csdnimg.cn/blog_migrate/ec9bd1bff403b13971b6f84c6a290a2c.jpeg)
这个most_sale_user也是一个dataframe结构,可以对它进行后续的处理,如统计、修改等等。
这个amazon_data['UserId']=='A3OXHLG6DIBRW8'是长这样的:
![1061ba4e5ee5791bf808d31a4d05ba21.png](https://i-blog.csdnimg.cn/blog_migrate/80fb2a4e2f2489ece4535f7cfba4f32f.jpeg)
然后再用 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](https://i-blog.csdnimg.cn/blog_migrate/04649dacf5c635218f8c24bfa00d7c56.jpeg)
user_sales是一个Series结构,左边是索引,UserId,右边是索引对应的数值。user_sales是按照购买金额降序排列的,第一个记录就是购买金额第一名的用户。那么直接找到第一个记录的索引,也就找到了购买最多的用户ID。
![e3ae9818ac943521598adb0ff8397240.png](https://i-blog.csdnimg.cn/blog_migrate/b19345e64db7267a0aa971ed429e7ed0.jpeg)
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](https://i-blog.csdnimg.cn/blog_migrate/7fabd7eba6186dd233de9104613aa8d7.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](https://i-blog.csdnimg.cn/blog_migrate/52bf8f6416718288746c9612823ea6a7.jpeg)
按条件赋值
比如,新增一列叫“类别”,用来判断订单价格是否大于均价。这就涉及到:先筛选出大于均值、小于均值的两组记录,再分别赋值:大于均值、小于均值。
amazon_data.loc[amazon_data['price(yuan)']>=amazon_data['price(yuan)'].mean(),'类别'] = '大于均值'
![789dc8fa8b0fe8878c11cb086d945e4d.png](https://i-blog.csdnimg.cn/blog_migrate/5dd3e460c90da28337dcd276e2fd838b.jpeg)
于是得到了新的一列【类别】,里面大于均值的订单,都已经赋值了。那么小于均值的,就有两种方法:
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](https://i-blog.csdnimg.cn/blog_migrate/a2399f72c504c3e313d134566524476e.jpeg)
同样可以用.isin() 找出某些城市、某些商品等等。
找出 9月-10月 的订单
之前已经处理过,将字符串格式改成了时间格式:
![be3f4e6bf60aabe645639863973ce017.png](https://i-blog.csdnimg.cn/blog_migrate/315d8a80e755590a8fb875dd6d902f3d.jpeg)
![a053de288236290f95f0355669b45496.png](https://i-blog.csdnimg.cn/blog_migrate/02ab717657534ce7e933ed5d5c01a93b.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](https://i-blog.csdnimg.cn/blog_migrate/78856b1c2d4c3317052aaff3809d53b5.jpeg)
good_order = amazon_data[amazon_data['Text'].str.contains('good')]
![448977d19540ffda3b6c5b2c266956e5.png](https://i-blog.csdnimg.cn/blog_migrate/d340ee8cb6de7df864a9404c70eea6d0.jpeg)
那么如何找出包含 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:数据的统计分析