python pandas练习:数据的过滤和排序
Ex1 - Filtering and Sorting Data
【Ex1 - 数据的过滤和排序】
This time we are going to pull data directly from the internet.
【这次我们直接从互联网获取数据】
Step 1. Import the necessary libraries
【第一步,导入必要的库】
import pandas as pd
Step 2. Import the dataset from this address.
【第二步,从这个地址获取数据】
Step 3. Assign it to a variable called chipo.
【将数据集赋值(assign)给变量chipo。】
sep:设置分隔符(separator),此处以一个tab(四个空格)为分隔符。
url = 'https://raw.githubusercontent.com/justmarkham/DAT8/master/data/chipotle.tsv'
chipo = pd.read_csv(url, sep = '\t')
Step 4. How many products cost more than $10.00?
【第四步,有多少产品的价格大于10美元?】
1、数据清理,将item_price列中的带$符的字符串转换为浮点数。
2、删除重复项。
3、筛选价格大于10的商品,获取名称,去重之后得到大于10商品的数量。
# clean the item_price column and transform it in a float
# 清理[item_price]列的数据,将其转换成float类型。
# float(value[1 : -1])表示字符串切片,将第2位至最后一位截取出来,这里作用是将价格最前面的$符号过滤掉,只保留后面的数字。
# value的取值就是循环取后面[item_price]列的所有值,全部转换成浮点数,保存至prices这个列表里。
prices = [float(value[1 : -1]) for value in chipo.item_price]
# reassign the column with the cleaned prices
# 重新将清理过后的数据赋值给[item_price]列。
chipo.item_price = prices
# delete the duplicates in item_name and quantity
# 删除掉[item_name]列与[quantity]列中的重复项。
# 后面跟的item_name、quantity、choice_description表示参考的列名,这里表示一行里这参考的三列都重复就删除这一行。默认参考所有列。
chipo_filtered = chipo.drop_duplicates(['item_name','quantity','choice_description'])
# chipo_filtered
# select only the products with quantity equals to 1
# 筛选出数量为1的商品。
chipo_one_prod = chipo_filtered[chipo_filtered.quantity == 1]
chipo_one_prod
# 方法一:
# 使用nunique()获取指定坐轴中不同元素的数量。
# 这里显示价格大于10的商品的数量。
chipo_one_prod[chipo_one_prod['item_price']>10].item_name.nunique()
# 这里显示所有价格大于10的商品,返回一个DataFrame。
chipo_one_prod[chipo_one_prod['item_price']>10]
# 方法二:
# 直接使用query()函数查询。函数作用是使用布尔表达式来查询DataFrame的列,最后返回的DataFrame类型的查询结果。
# 这里使用'item_price > 10'这个表达式,最后得到一个[item_price]列的值都大于10的DataFrame。再使用item_name.nunique()获取商品名称并得到名称去重之后的数量。
chipo.query('item_price > 10').item_name.nunique()
31
Step 5. What is the price of each item?
【第五步,每一个物品的价格是多少?】
print a data frame with only two columns item_name and item_price
【输出一个只包含[item_name]与[item_price]两列的DataFrame。】
# delete the duplicates in item_name and quantity
# 删除[item_name]与[quantity]中的重复项。
chipo_filtered = chipo.drop_duplicates(['item_name','quantity'])
# []里的是筛选条件,这里是筛选出[item_name]的值为'Chicken Bowl',并且[quantity]的值为1的数据。
chipo[(chipo['item_name'] == 'Chicken Bowl') & (chipo['quantity'] == 1)]
# select only the products with quantity equals to 1
# 筛选出数量为1的商品。
chipo_one_prod = chipo_filtered[chipo_filtered.quantity == 1]
# select only the item_name and item_price columns
# 将[item_name]与[item_price]这两列单独筛选出来。
price_per_item = chipo_one_prod[['item_name', 'item_price']]
# sort the values from the most to less expensive
# 按照价格从高到底排列。
# 使用sort_values()函数进行排序,by表示排序要参考的列,ascending=False表示降序排序,默认升序排序。
price_per_item.sort_values(by = "item_price", ascending = False).head(20)
item_name | item_price | |
---|---|---|
606 | Steak Salad Bowl | 11.89 |
1229 | Barbacoa Salad Bowl | 11.89 |
1132 | Carnitas Salad Bowl | 11.89 |
7 | Steak Burrito | 11.75 |
168 | Barbacoa Crispy Tacos | 11.75 |
39 | Barbacoa Bowl | 11.75 |
738 | Veggie Soft Tacos | 11.25 |
186 | Veggie Salad Bowl | 11.25 |
62 | Veggie Bowl | 11.25 |
57 | Veggie Burrito | 11.25 |
250 | Chicken Salad | 10.98 |
5 | Chicken Bowl | 10.98 |
8 | Steak Soft Tacos | 9.25 |
554 | Carnitas Crispy Tacos | 9.25 |
237 | Carnitas Soft Tacos | 9.25 |
56 | Barbacoa Soft Tacos | 9.25 |
92 | Steak Crispy Tacos | 9.25 |
664 | Steak Salad | 8.99 |
54 | Steak Bowl | 8.99 |
3750 | Carnitas Salad | 8.99 |
Step 6. Sort by the name of the item
【第六步,按照物品的名字排序】
列举了两种排序的方法。
chipo.item_name.sort_values()
# OR
chipo.sort_values(by = "item_name")
order_id | quantity | item_name | choice_description | item_price | |
---|---|---|---|---|---|
3389 | 1360 | 2 | 6 Pack Soft Drink | [Diet Coke] | 12.98 |
341 | 148 | 1 | 6 Pack Soft Drink | [Diet Coke] | 6.49 |
1849 | 749 | 1 | 6 Pack Soft Drink | [Coke] | 6.49 |
1860 | 754 | 1 | 6 Pack Soft Drink | [Diet Coke] | 6.49 |
2713 | 1076 | 1 | 6 Pack Soft Drink | [Coke] | 6.49 |
... | ... | ... | ... | ... | ... |
2384 | 948 | 1 | Veggie Soft Tacos | [Roasted Chili Corn Salsa, [Fajita Vegetables,... | 8.75 |
781 | 322 | 1 | Veggie Soft Tacos | [Fresh Tomato Salsa, [Black Beans, Cheese, Sou... | 8.75 |
2851 | 1132 | 1 | Veggie Soft Tacos | [Roasted Chili Corn Salsa (Medium), [Black Bea... | 8.49 |
1699 | 688 | 1 | Veggie Soft Tacos | [Fresh Tomato Salsa, [Fajita Vegetables, Rice,... | 11.25 |
1395 | 567 | 1 | Veggie Soft Tacos | [Fresh Tomato Salsa (Mild), [Pinto Beans, Rice... | 8.49 |
4622 rows × 5 columns
Step 7. What was the quantity of the most expensive item ordered?
【第七步,价格最高的订购的物品,它的数量有多少。】
使用sort_values()按照价格降序,再使用head(1)获取价格最高物品的信息,里面包含了数量。
chipo.sort_values(by = "item_price", ascending = False).head(1)
order_id | quantity | item_name | choice_description | item_price | |
---|---|---|---|---|---|
3598 | 1443 | 15 | Chips and Fresh Tomato Salsa | NaN | 44.25 |
Step 8. How many times was a Veggie Salad Bowl ordered?
【第八步,Veggie Salad Bowl(蔬菜沙拉碗)被订购了多少次?】
使用query()函数也能达到相同的效果。
chipo_salad = chipo[chipo.item_name == "Veggie Salad Bowl"]
# chipo_salad = chipo.query('item_name == "Veggie Salad Bowl"')
len(chipo_salad)
18
Step 9. How many times did someone order more than one Canned Soda?
【第九步,人们一次性订购Canned Soda(罐装苏打水)的数量超过1个的次数有多少?】
即item_name是"Canned Soda"并且数量(quantity)大于1的订单有多少。
这里也可以使用query()函数来查询,效果一样。
chipo_drink_steak_bowl = chipo[(chipo.item_name == "Canned Soda") & (chipo.quantity > 1)]
# chipo_drink_steak_bowl = chipo.query('item_name == "Canned Soda" & quantity > 1')
len(chipo_drink_steak_bowl)
20