综合练习
In [1]:
import pandas as pd import numpy as np
端午节的淘宝粽子交易
df = pd.read_csv("端午粽子数据.csv").convert_dtypes()
df.head()
Out[2]:
标题 | 价格 | 付款人数 | 店铺 | 发货地址 | |
---|---|---|---|---|---|
0 | 五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 | 129 | 6人付款 | 五芳斋官方旗舰店 | 浙江 嘉兴 |
1 | 北京稻香村端午粽子手工豆沙粽220g*2袋散装豆沙粽香甜软糯豆沙粽 | 44 | 8人付款 | 天猫超市 | 上海 |
2 | 五芳斋粽子礼盒装鲜肉咸蛋黄大肉粽嘉兴豆沙甜粽端午团购散装礼品 | 89.9 | 100万+人付款 | 五芳斋官方旗舰店 | 浙江 嘉兴 |
3 | 稻香私房鲜肉粽蛋黄肉粽嘉兴粽子咸鸭蛋礼盒装端午节送礼特产团购 | 138 | 1936人付款 | 稻香村食品旗舰店 | 北京 |
4 | 嘉兴粽子 蛋黄鲜肉粽新鲜大肉粽早餐散装团购浙江特产蜜枣多口味 | 3.8 | 9500+人付款 | 城城喂食猫 | 浙江 嘉兴 |
df.info()
<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 string 1 价格 4403 non-null string 2 付款人数 4332 non-null string 3 店铺 4403 non-null string 4 发货地址 4400 non-null string dtypes: string(5) memory usage: 172.1 KB
(1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。
df.columns = [i.strip() for i in df.columns]
df.columns
Out[4]:
Index(['标题', '价格', '付款人数', '店铺', '发货地址'], dtype='object')
s= pd.Series(['_45','45_','1','1.23','1.1.'],dtype='string')
s.str.extract(r'(-?[0-9]+\.*\d*)')
Out[5]:
0 | |
---|---|
0 | 45 |
1 | 45 |
2 | 1 |
3 | 1.23 |
4 | 1.1 |
# 删除发货地址为空的行
df = df.dropna(subset=['发货地址'])
df_cal = df.copy()
df_cal['价格'] = df_cal['价格'].str.extract(r'(-?[0-9]+\.*\d*)')
df_cal['价格'] = df_cal['价格'] .astype('Float64')
df_cal[df_cal['发货地址'].isin(['浙江 杭州'])]['价格'].mean()
Out[6]:
80.90088888888889
(2) 商品标题带有“嘉兴”但发货地却不在嘉兴的商品有多少条记录?
df[(df['标题'].str.contains(r'嘉兴')) & (~df['发货地址'].str.contains(r'嘉兴'))].count()
Out[7]:
标题 1032 价格 1032 付款人数 984 店铺 1032 发货地址 1032 dtype: int64
(3) 请按照分位数将价格分为“高、较高、中、较低、低”5 个类别,再将 类别结果插入到标题一列之后,最后对类别列进行降序排序。
range_list = [0]
for i in range(2,11,2):
range_list.append(df_cal['价格'].quantile(q=i*0.1))
df['价格类'] = pd.cut(df_cal['价格'],range_list,right=True,labels=['高', '较高', '中', '较低', '低'][::-1])
df.sort_values('价格类',ascending=False).head()
Out[9]:
标题 | 价格 | 付款人数 | 店铺 | 发货地址 | 价格类 | |
---|---|---|---|---|---|---|
0 | 五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 | 129 | 6人付款 | 五芳斋官方旗舰店 | 浙江 嘉兴 | 高 |
847 | 真真老老蛋黄肉粽140g*60个新鲜大肉粽冷冻方便早餐嘉兴粽子端午 | 168 | 139人付款 | tb6182109_2012 | 上海 | 高 |
2773 | 山西双合成粽子端午节送礼御粽膳坊礼盒粽叶板栗豆沙黄米杂粮粽 | 129 | 33人付款 | 双合成旗舰店 | 山西 晋中 | 高 |
2768 | 采芝斋粽子甜粽新鲜蛋黄大肉粽嘉兴口味鲜肉粽子食品端午礼盒定制 | 216 | 47人付款 | 采芝斋杭州专卖店 | 浙江 杭州 | 高 |
2763 | 真真老老臻瑞礼盒1.12kg/盒端午节粽子礼盒装送130g经典鲜肉粽 | 126 | 2人付款 | 天猫超市 | 上海 | 高 |
(4) 付款人数一栏有缺失值吗?若有则请利用上一问的分类结果对这些缺失 值进行合理估计并填充。
#查看是否有缺失
df.loc[df['付款人数'].isna()].head()
Out[10]:
标题 | 价格 | 付款人数 | 店铺 | 发货地址 | 价格类 | |
---|---|---|---|---|---|---|
183 | 五芳斋 140g*8只大粽子 福韵端午豆沙蜜枣蛋黄粽新包装送礼礼盒 | 50.9 | <NA> | 天猫会员店 | 上海 | 中 |
243 | 五芳斋福雅五芳粽子礼盒端午咸甜粽子绿豆糕咸鸭蛋送礼 | 79.9 | <NA> | 天猫会员店 | 上海 | 较高 |
347 | 【百草味】龙腾粽1090g 早餐大肉粽子湖州特产嘉兴粽 | 39.9 | <NA> | 天猫会员店 | 上海 | 中 |
386 | 五芳斋华礼竹篮礼盒1360g蛋粽组合端午礼品嘉兴粽子礼盒 | 129 | <NA> | 天猫会员店 | 上海 | 高 |
389 | 百草味 龙腾粽礼盒1460g 10只装早餐大肉粽子湖州特产嘉兴 | 49.9 | <NA> | 天猫会员店 | 上海 | 中 |
df_cal.loc[df.index,'价格类'] = df['价格类']
for name,group in df_cal.groupby('价格类'):
# 提取付款人数的数值表达
group['付款人数'] = pd.to_numeric(group['付款人数'].str.extract(r'([0-9]+)')[0],errors='coerce')
temp = group[['付款人数','价格']].sort_values('价格').interpolate(limit_direction='both')['付款人数']
df.loc[group.index,'付款人数'] = temp.astype('int64').astype('str').astype('string')+"人付款"
df.loc[df['付款人数'].isna()]
Out[12]:
(5) 请将数据后四列合并为如下格式的 Series:商品发货地为 ××,店铺为 ××,共计 ×× 人付款,单价为 ××。
df['detail'] = '商品发货地为'+df['发货地址']+',店铺为'+df['店铺']+',共计'+df['付款人数']+",单价为"+df['价格']
df.head()
Out[13]:
标题 | 价格 | 付款人数 | 店铺 | 发货地址 | 价格类 | detail | |
---|---|---|---|---|---|---|---|
0 | 五芳斋粽子礼盒 心悦+18只装咸鸭蛋组合端午节礼品团购嘉兴肉粽子 | 129 | 6人付款 | 五芳斋官方旗舰店 | 浙江 嘉兴 | 高 | 商品发货地为浙江 嘉兴,店铺为五芳斋官方旗舰店,共计6人付款,单价为129 |
1 | 北京稻香村端午粽子手工豆沙粽220g*2袋散装豆沙粽香甜软糯豆沙粽 | 44 | 8人付款 | 天猫超市 | 上海 | 中 | 商品发货地为上海,店铺为天猫超市,共计8人付款,单价为44 |
2 | 五芳斋粽子礼盒装鲜肉咸蛋黄大肉粽嘉兴豆沙甜粽端午团购散装礼品 | 89.9 | 100人付款 | 五芳斋官方旗舰店 | 浙江 嘉兴 | 较高 | 商品发货地为浙江 嘉兴,店铺为五芳斋官方旗舰店,共计100人付款,单价为89.9 |
3 | 稻香私房鲜肉粽蛋黄肉粽嘉兴粽子咸鸭蛋礼盒装端午节送礼特产团购 | 138 | 1936人付款 | 稻香村食品旗舰店 | 北京 | 高 | 商品发货地为北京,店铺为稻香村食品旗舰店,共计1936人付款,单价为138 |
4 | 嘉兴粽子 蛋黄鲜肉粽新鲜大肉粽早餐散装团购浙江特产蜜枣多口味 | 3.8 | 9500人付款 | 城城喂食猫 | 浙江 嘉兴 | 低 | 商品发货地为浙江 嘉兴,店铺为城城喂食猫,共计9500人付款,单价为3.8 |
(6) 请将上一问中的结果恢复成原来的四列。
new_df = pd.DataFrame(index=df.index)
new_df['发货地址'] = df['detail'].str.extract(r"商品发货地为(.+),店")
new_df['店铺'] = df['detail'].str.extract(r"店铺为(.+),共")
new_df['付款人数'] = df['detail'].str.extract(r"共计(.+),单")
new_df['价格'] = df['detail'].str.extract(r"单价为(.+)")
new_df
Out[14]:
发货地址 | 店铺 | 付款人数 | 价格 | |
---|---|---|---|---|
0 | 浙江 嘉兴 | 五芳斋官方旗舰店 | 6人付款 | 129 |
1 | 上海 | 天猫超市 | 8人付款 | 44 |
2 | 浙江 嘉兴 | 五芳斋官方旗舰店 | 100人付款 | 89.9 |
3 | 北京 | 稻香村食品旗舰店 | 1936人付款 | 138 |
4 | 浙江 嘉兴 | 城城喂食猫 | 9500人付款 | 3.8 |
... | ... | ... | ... | ... |
4398 | 浙江 嘉兴 | 红船旗舰店 | 347人付款 | 7.9 |
4399 | 四川 乐山 | 峨眉山隐栗粑粑罗栗 | 80人付款 | 93 |
4400 | 北京 | 北京美程嘉译 | 5人付款 | 98.2 |
4401 | 安徽 合肥 | chaoge1931 | 149人付款 | 65.9 |
4402 | 广东 东莞 | hezhiqi | 20人付款 | 99 |
4400 rows × 4 columns