练习一、端午节淘宝粽子交易问题: (1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。 (2) 商品标题带有“嘉兴”,但发货地却不在嘉兴的商品有多少记录?(3)请按照分位数将价格分为“高、较高、中、较低、低”5个类别,再将类别结果插入到标题一列后,最后对类别列进行降序排序。 (4)付款人数一栏有缺失值吗?若有则请利用上一问的分类结果对这些缺失值进行合理估计并填充 (5)请将数据后四列合并为如下格式的Series:商品发货地为XX,店铺为XX,共计XX人付款,单价为XX。 (6)请将上一问中的结果恢复成原来的四列。 第一问:请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。
##删除发货地为缺失值的行 import pandas as pd import numpy as np df = pd.read_csv('data/table_damplings.csv',encoding='gbk') #df.rename(columns={'标题':'name','价格':'price','付款人数':'number','店铺':'shop','发货地址':'address'},inplace=True) df.columns=["name","price","number","shop","address"] df[df['address'].isna()].dropna(axis=0,how='any') ##求在杭州发货的商品单价均值df_1 = df[df['address']=='浙江 杭州'] df_1['price'] = pd.to_numeric(df_1['price'])df_1['price'].mean() ##结果为80.90088888第二问:商品标题带有“嘉兴”,但发货地却不在嘉兴的商品有多少记录? 这里我使用的是比较笨的方法,当时不知道不等于怎么写,就用名字包含嘉兴的商品记录数减去发货地在浙江嘉兴的了
df_2 = df[df['name'].str.contains('嘉兴')] df_3 = df_2[df_2['address'] == '浙江 嘉兴'] len(df_2)-len(df_3)第三问:请按照分位数将价格分为“高、较高、中、较低、低”5个类别,再将类别结果插入到标题一列后,最后对类别列进行降序排序。
bins = df['price'].quantile(np.linspace(0,1,6)).tolist() cuts = pd.cut(df['price'],bins=bins,labels=['低','较低','中','较高','高']) #可选label添加自定义标签 df['cuts'] = cuts df.head() df_2 = df.sort_values(by=['cuts'],ascending=False) df_2.head()第四问:付款人数一栏有缺失值吗?若有则请利用上一问的分类结果对这些缺失值进行合理估计并填充。 答:有缺失值,71个。
df['number'].isna().sum() df_2['number'].fillna(method='ffill') ###选择向前填充 df_2.head()第五问:请将数据后四列合并为如下格式的Series:商品发货地为XX,店铺为XX,共计XX人付款,单价为XX。
df_2['infor'] = "商品发货地为"+df_2['address'].map(str)+' , '+"店铺为"+df_2['shop'].map(str)+' , '+"共计人付款"+df_2['number'].map(str)+' , '+"单价为"+df_2['price'].map(str) df_2.head()第六问:请将上一问中的结果恢复成原来的四列。
pd.concat([df_2,df_2['infor'].str.split(',',expand=True)],axis = 1).head()