一、端午节的淘宝粽子交易
刚刚考完试来做题做了一晚上一道题都没做完全,先提交打卡了,后面再慢慢补。
问题 (1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。
import pandas as pd
import numpy as np
df = pd.read_csv(r'data\端午粽子数据.csv')
df.head()
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
0 |
五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 |
129 |
6人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
1 |
北京稻香村端午粽子手工豆沙粽220g*2袋散装豆沙粽香甜软糯豆沙粽 |
44 |
8人付款 |
天猫超市 |
上海 |
2 |
五芳斋粽子礼盒装鲜肉咸蛋黄大肉粽嘉兴豆沙甜粽端午团购散装礼品 |
89.9 |
100万+人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
3 |
稻香私房鲜肉粽蛋黄肉粽嘉兴粽子咸鸭蛋礼盒装端午节送礼特产团购 |
138 |
1936人付款 |
稻香村食品旗舰店 |
北京 |
4 |
嘉兴粽子 蛋黄鲜肉粽新鲜大肉粽早餐散装团购浙江特产蜜枣多口味 |
3.8 |
9500+人付款 |
城城喂食猫 |
浙江 嘉兴 |
df.info()
df.columns
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4403 entries, 0 to 4402
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 标题 4403 non-null object
1 价格 4403 non-null object
2 付款人数 4332 non-null object
3 店铺 4403 non-null object
4 发货地址 4400 non-null object
dtypes: object(5)
memory usage: 172.1+ KB
Index(['标题', ' 价格', '付款人数', '店铺', '发货地址 '], dtype='object')
df.columns = df.columns.str.strip()
df[df['发货地址'].isna()]
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
1847 |
贞丰胖四娘灰粽传统肉粽真空板栗鲜肉粽方便速食端午贵州粽子5只 |
46.8 |
41人付款 |
贵州原产地商品官方旗舰店 |
NaN |
2418 |
素缤纷粽子140g*6入袋装净素素食纯素蔬食素粽早餐点心端午送礼 |
49.4 |
40人付款 |
素缤纷精致素食自助式餐厅 |
NaN |
2716 |
辰颐物语热销嘉兴私房粽子10只礼盒装6味大粽荤素搭配送礼可团购 |
39.9 |
110人付款 |
水果达人多吃水果有益健康 |
NaN |
df.dropna(axis=0,subset=['发货地址'],inplace=True)
df[df['发货地址'].isna()]
df[df['发货地址'].str.contains(r'杭州')]
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
15 |
【百草味-经典龙腾粽1460g】蛋黄肉甜粽子特产嘉兴粽端午整箱礼盒 |
78 |
2372人付款 |
百草味旗舰店 |
浙江 杭州 |
26 |
知味观端午节粽子甜粽咸蛋黄大肉粽礼盒装嘉兴味鲜肉粽子散装团购 |
64.9 |
8.5万+人付款 |
知味观官方旗舰店 |
浙江 杭州 |
53 |
知味观龙飞粽舞端午节粽子礼盒装礼品嘉兴口味鲜肉粽子绿豆糕团购 |
88 |
1355人付款 |
知味观官方旗舰店 |
浙江 杭州 |
71 |
知味观风俗志端午节粽子礼盒装送礼蛋黄鲜肉粽甜粽绿豆糕礼品团购 |
158 |
1333人付款 |
知味观官方旗舰店 |
浙江 杭州 |
89 |
知味观粽子新鲜大肉粽手工嘉兴口味鲜肉粽子懒人食品散装早餐速食 |
52.9 |
7500+人付款 |
知味观官方旗舰店 |
浙江 杭州 |
... |
... |
... |
... |
... |
... |
4355 |
知味观粽乐乐粽子礼盒装大肉粽蛋黄鲜肉粽豆沙甜粽嘉兴口味团购 |
79.9 |
21人付款 |
杭州知味观 |
浙江 杭州 |
4364 |
网易严选五彩缠角粽 中国粽礼盒装 1.2千克 粽子蛋黄肉粽真空新鲜 |
109 |
3人付款 |
网易严选美食馆 |
浙江 杭州 |
4375 |
妙维根板栗净素粽糙米藜麦全素粽子无糖低卡低gi代餐无油低脂饱腹 |
11.99 |
42人付款 |
xutong2080 |
浙江 杭州 |
4376 |
东方贺礼端午节礼盒嘉兴粽子高汤蛋黄鲜大肉粽特产现已支持定制 |
45_ |
17人付款 |
缘来有礼 |
浙江 杭州 |
4397 |
知味观家乡知味粽子礼盒装端午节礼品杭州特产鸭蛋大礼包送礼福利 |
82 |
7人付款 |
韩丽丽92 |
浙江 杭州 |
180 rows × 5 columns
df[df['发货地址'].str.contains(r'杭州')].价格.astype('float').mean()
80.90088888888877
(2) 商品标题带有“嘉兴”但发货地却不在嘉兴的商品有多少条记录?
df[df['标题'].str.contains(r'嘉兴')&(~df['发货地址'].str.contains(r'嘉兴'))]
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
3 |
稻香私房鲜肉粽蛋黄肉粽嘉兴粽子咸鸭蛋礼盒装端午节送礼特产团购 |
138 |
1936人付款 |
稻香村食品旗舰店 |
北京 |
6 |
五芳斋华礼竹篮礼盒1360g蛋粽组合端午礼品嘉兴粽子礼盒 |
159 |
1028人付款 |
天猫超市 |
上海 |
8 |
真真老老嘉情礼盒10粽6蛋1.52kg/盒嘉兴粽子端午节粽子礼盒装 |
109 |
2117人付款 |
天猫超市 |
上海 |
9 |
五芳斋嘉兴粽子新鲜量贩蛋黄肉粽豆沙粽悦喜散装端午特产600g*2袋 |
59.9 |
1349人付款 |
天猫超市 |
上海 |
10 |
真真老老粽子臻芯800g/盒*1端午节礼盒装嘉兴特产送礼 |
75 |
1815人付款 |
天猫超市 |
上海 |
... |
... |
... |
... |
... |
... |
4377 |
超港端午粽子肉粽蜜枣粽大肉棕子黄山特产礼盒新鲜嘉兴粽子肉粽 |
39.9 |
67人付款 |
超港旗舰店 |
安徽 黄山 |
4383 |
真真老老真情粽子咸蛋礼盒嘉兴特产肉粽豆沙甜枣粽端午节团购批发 |
79.9 |
10人付款 |
曈宝食品专营店 |
上海 |
4386 |
臻味德嘉兴粽子竹篮礼盒装农家手工蛋黄鲜肉棕甜粽端午节伴手礼品 |
49.08 |
2人付款 |
气泡西柚屋 |
浙江 温州 |
4393 |
傅太粽子10只蛋黄肉粽鲜肉粽嘉兴风味肉粽子即食早餐端午团购 |
60.2 |
46人付款 |
love侯氏 |
江西 萍乡 |
4401 |
【粉丝专享】端午节特产新鲜蛋黄鲜肉粽豆沙嘉兴粽子800g/箱 |
65.9 |
149人付款 |
chaoge1931 |
安徽 合肥 |
1032 rows × 5 columns
df[df['标题'].str.contains(r'嘉兴')&(~df['发货地址'].str.contains(r'嘉兴'))].count()
标题 1032
价格 1032
付款人数 984
店铺 1032
发货地址 1032
dtype: int64
(3) 请按照分位数将价格分为“高、较高、中、较低、低”5 个类别,再将 类别结果插入到标题一列之后,最后对类别列进行降序排序。
def is_number(x):
try:
float(x)
return True
except:
return False
df[~df.价格.map(is_number)]
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
538 |
五芳斋粽子蛋黄鲜肉粽豆沙粽栗子肉棕子新鲜散装批发团购嘉兴肉粽 |
45.9. |
1.0万+人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
4376 |
东方贺礼端午节礼盒嘉兴粽子高汤蛋黄鲜大肉粽特产现已支持定制 |
45_ |
17人付款 |
缘来有礼 |
浙江 杭州 |
df.loc[[538,4376],'价格'] = [45.9,45]
df[~df.价格.map(is_number)]
df['价格']=df['价格'].astype('float')
df['类别'] = pd.qcut(df.价格,[0,0.2,0.4,0.6,0.8,1.],labels=['低','较低','中','较高','高'])
df.head()
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
类别 |
0 |
五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 |
129.0 |
6人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
高 |
1 |
北京稻香村端午粽子手工豆沙粽220g*2袋散装豆沙粽香甜软糯豆沙粽 |
44.0 |
8人付款 |
天猫超市 |
上海 |
中 |
2 |
五芳斋粽子礼盒装鲜肉咸蛋黄大肉粽嘉兴豆沙甜粽端午团购散装礼品 |
89.9 |
100万+人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
较高 |
3 |
稻香私房鲜肉粽蛋黄肉粽嘉兴粽子咸鸭蛋礼盒装端午节送礼特产团购 |
138.0 |
1936人付款 |
稻香村食品旗舰店 |
北京 |
高 |
4 |
嘉兴粽子 蛋黄鲜肉粽新鲜大肉粽早餐散装团购浙江特产蜜枣多口味 |
3.8 |
9500+人付款 |
城城喂食猫 |
浙江 嘉兴 |
低 |
df.sort_values(by='类别',ascending=False)
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
类别 |
0 |
五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 |
129.00 |
6人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
高 |
847 |
真真老老蛋黄肉粽140g*60个新鲜大肉粽冷冻方便早餐嘉兴粽子端午 |
168.00 |
139人付款 |
tb6182109_2012 |
上海 |
高 |
2773 |
山西双合成粽子端午节送礼御粽膳坊礼盒粽叶板栗豆沙黄米杂粮粽 |
129.00 |
33人付款 |
双合成旗舰店 |
山西 晋中 |
高 |
2768 |
采芝斋粽子甜粽新鲜蛋黄大肉粽嘉兴口味鲜肉粽子食品端午礼盒定制 |
216.00 |
47人付款 |
采芝斋杭州专卖店 |
浙江 杭州 |
高 |
2763 |
真真老老臻瑞礼盒1.12kg/盒端午节粽子礼盒装送130g经典鲜肉粽 |
126.00 |
2人付款 |
天猫超市 |
上海 |
高 |
... |
... |
... |
... |
... |
... |
... |
3637 |
新鲜粽叶包粽子的叶子干粽子叶大号竹子叶竹叶苇叶皮大鲜粽叶干种 |
4.00 |
617人付款 |
海倪食品专营店 |
广东 广州 |
低 |
2129 |
嘉兴五芳斋粽子 真空100克*2只紫米栗蓉粽端午节甜粽子 |
11.00 |
2897人付款 |
五芳斋官方旗舰店 |
浙江 嘉兴 |
低 |
2130 |
三珍斋蛋黄粽200g真空100g*2只嘉兴特产粽子速食早餐 |
7.88 |
NaN |
天猫会员店 |
上海 |
低 |
2131 |
俏香阁经典鲜肉粽子120g*2只端午节嘉兴特产速食早餐点心 |
5.90 |
NaN |
天猫会员店 |
上海 |
低 |
2916 |
甜粽子蜜枣粽端午送人礼品豆沙粽红豆赤豆粽方便早餐素棕散装团购 |
21.90 |
230人付款 |
集采食品专营店 |
浙江 嘉兴 |
低 |
4400 rows × 6 columns
(4) 付款人数一栏有缺失值吗?若有则请利用上一问的分类结果对这些缺失 值进行合理估计并填充。
df[df.付款人数.isnull()].head()
|
标题 |
价格 |
付款人数 |
店铺 |
发货地址 |
类别 |
183 |
五芳斋 140g*8只大粽子 福韵端午豆沙蜜枣蛋黄粽新包装送礼礼盒 |
50.9 |
NaN |
天猫会员店 |
上海 |
中 |
243 |
五芳斋福雅五芳粽子礼盒端午咸甜粽子绿豆糕咸鸭蛋送礼 |
79.9 |
NaN |
天猫会员店 |
上海 |
较高 |
347 |
【百草味】龙腾粽1090g 早餐大肉粽子湖州特产嘉兴粽 |
39.9 |
NaN |
天猫会员店 |
上海 |
中 |
386 |
五芳斋华礼竹篮礼盒1360g蛋粽组合端午礼品嘉兴粽子礼盒 |
129.0 |
NaN |
天猫会员店 |
上海 |
高 |
389 |
百草味 龙腾粽礼盒1460g 10只装早餐大肉粽子湖州特产嘉兴 |
49.9 |
NaN |
天猫会员店 |
上海 |
中 |
s1=df[df.付款人数.notna()].付款人数
s1.astype('string')
0 6人付款
1 8人付款
2 100万+人付款
3 1936人付款
4 9500+人付款
...
4398 347人付款
4399 80人付款
4400 5人付款
4401 149人付款
4402 20人付款
Name: 付款人数, Length: 4329, dtype: string
s12=s1[s1.str.contains(r'万')].str.extract(r'(\d+.?\d+?)万')
s12
|
0 |
2 |
100 |
11 |
2.0 |
14 |
70 |
26 |
8.5 |
36 |
10 |
... |
... |
1333 |
1.0 |
1646 |
1.5 |
1756 |
7.0 |
3155 |
1.5 |
3468 |
2.0 |
65 rows × 1 columns
s12=s12.astype('float')*10000
s12.head()
|
0 |
2 |
1000000.0 |
11 |
20000.0 |
14 |
700000.0 |
26 |
85000.0 |
36 |
100000.0 |
s13=s1[~s1.str.contains(r'万')].str.split('人付款',expand=True)[0].str.replace(r'\s+','').str.replace(r'+','').astype('int')
s13
0 6
1 8
3 1936
4 9500
5 17
...
4398 347
4399 80
4400 5
4401 149
4402 20
Name: 0, Length: 4264, dtype: int32
len(s1)==len(s12)+len(s13)
True
s = pd.concat([s13,s12])
s.name = '付款人数'
s.head()
|
0 |
0 |
6.0 |
1 |
8.0 |
3 |
1936.0 |
4 |
9500.0 |
5 |
17.0 |
df2=df[df.付款人数.notna()][['类别','付款人数']].copy()
df2.update(s)
df2
|
类别 |
付款人数 |
0 |
高 |
6人付款 |
1 |
中 |
8人付款 |
2 |
较高 |
100万+人付款 |
3 |
高 |
1936人付款 |
4 |
低 |
9500+人付款 |
... |
... |
... |
4398 |
低 |
347人付款 |
4399 |
较高 |
80人付款 |
4400 |
较高 |
5人付款 |
4401 |
较高 |
149人付款 |
4402 |
较高 |
20人付款 |
4329 rows × 2 columns
df2
|
类别 |
付款人数 |
0 |
高 |
6人付款 |
1 |
中 |
8人付款 |
2 |
较高 |
100万+人付款 |
3 |
高 |
1936人付款 |
4 |
低 |
9500+人付款 |
... |
... |
... |
4398 |
低 |
347人付款 |
4399 |
较高 |
80人付款 |
4400 |
较高 |
5人付款 |
4401 |
较高 |
149人付款 |
4402 |
较高 |
20人付款 |
4329 rows × 2 columns