Pandas 教程(下)综合练习
一、端午节的淘宝粽子交易
(1) 请删除最后一列为缺失值的行,并求所有在杭州发货的商品单价均值。
df_1 = pd.read_csv('../data/端午粽子数据.csv')
df_1.head()
# 结果可以看出有很多脏数据
df_1.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 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
df_1.columns
Index(['标题', ' 价格', '付款人数', '店铺', '发货地址 '], dtype='object')
# 去掉空格
df_1.columns = df_1.columns.str.strip()
# 去掉发货地址的缺失值
df_1.dropna(axis=0, subset=['发货地址'], inplace=True)
# 寻找脏数据
df_hz = df_1.loc[df_1['发货地址'].str.contains(r'杭州')]
df_hz.loc[~df_hz['价格'].str.match(r'^\d+\.?\d+$')]
df_hz.loc[4376, '价格'] = 45
df_hz['价格'].astype('float').mean()
80.90088888888877
(2) 商品标题带有“嘉兴”但发货地却不在嘉兴的商品有多少条记录?
df_jx = df_1.loc[df_1['标题'].str.contains(r'嘉兴')]
df_jx.loc[~df_jx['发货地址'].str.contains(r'嘉兴')]
(3) 请按照分位数将价格分为“高、较高、中、较低、低”5 个类别,再将
类别结果插入到标题一列之后,最后对类别列进行降序排序。
# 找出不正常的数字
df_1.loc[~df_1['价格'].str.match(r'^\d+\.?\d+$')]
df_1.loc[[538, 4376], '价格'] = [45.9, 45]
df_1['价格'] = df_1['价格'].astype('float')
# 按照百分位数分组
df_1['价位'] = pd.cut(df_1['价格'], bins=np.percentile(df_1['价格'], [0, 20, 40, 60, 80, 100]), labels=['低', '较低', '中', '较高', '高'])
df_1
cols = list(df_1.columns)
cols.remove('价位')
cols.insert(1, '价位')
df_1 = df_1[cols]
df_1.sort_values('价位', ascending=False)
df_1.loc[df_1['价位'].isna(), '价位'] = ['低', '低']
(4) 付款人数一栏有缺失值吗?若有则请利用上一问的分类结果对这些缺失
值进行合理估计并填充。
df_1.loc[df_1['付款人数'].isna()]
df_1 = df_1.convert_dtypes()
df_1['人数'] = df_1['付款人数'].str.replace(r'人付款', '')
df_1['人数'] = df_1['人数'].str.replace(r'\+', '')
df_dot = df_1.loc[df_1['人数'].str.contains(r'\.'), '人数'].str.replace('.', '')
df_dot = df_dot.str.replace('万', '000')
df_1.loc[list(df_dot.index), '人数'] = list(df_dot.values)
df_wan = df_1.loc[df_1['人数'].str.contains('万'), '人数']