豆瓣读书练习
如上数据有问题如下:
• 索引无序
• 单价中包含各种各样单位
所以需求如下:
• 读取数据 重置索引
• 将单价列取出 整数 或 浮点数 并转为可计算类型
• 将评分列进行降序
• 直观体现评分数据主要分布在哪个区间
• 直观体现单价与评分的分布
• 取出评分前100条数据 直观体现不同出版社的出书次数
import pandas as pd
import numpy as np
import seaborn as sns
from matplotlib import pyplot as plt
db_read = pd.read_excel("豆瓣读书.xlsx",index_col=0)
db_read.info()
db_read.head()
# 重置索引
db_read.reset_index(drop=True,inplace=True)
"""
解决单位问题:
- 思路1:将单位替换为空字符串
"""
# db_read["单价"] = db_read["单价"].str.replace("元","")
# db_read["单价"] = db_read["单价"].str.replace("元","")
# db_read
# db_read["单价"].astype("float")
"""
- 思路2:匹配出浮点数
需求:去字符串中匹配部分符合条件的子字符串
实现:
- 使用正则(re)
- pandas中Series每行字符串对接的正则方法:Series.str.extract(pattern)
- 提取 浮点数或者整数 pattern:数值.数值
- \d 匹配数值
- + 贪婪匹配(匹配多个符合条件的)
- \. 匹配出小数点
- () 分组
- | 或
"""
db_read["单价"] = db_read["单价"].str.extract("(\d+\.\d+)|(\d+)").fillna(axis=1,method="bfill")[0]
db_read
db_read["单价"] = db_read["单价"].astype("float")
db_read.info()
desc_data = db_read.sort_values(by="评分",ascending=False)
desc_data
sns.distplot(db_read["评分"])
sns.jointplot(x="单价",y="评分",data=db_read)
top_100 = desc_data.iloc[:100,:]
top_100
sns.catplot(x="出版社",data=top_100,kind="count",height=10)
plt.xticks(rotation=90)
plt.show()
介绍filter高阶函数
s = "oldamy22.11"
# 构建一个函数,只保留字符串中数值以及小数点部分
f = lambda x: x in "0123456789."
f(s)
# 高阶函数,过滤的
# "22.11"
li = list(filter(f,s))
"".join(li)