Python数据分析面试实战
作者:互联网
ya~老amy来了,今儿给大家分享一个朋友面试数据分析的实战项目,建议大家也可以独立的做一做。
需求如下:
看完这,可能第一反应就是头都大了。原始数据?结果数据?标准数据?但是冷静下来,对数据进行观察之后,呈现出下方截图:
图看不明白没事儿,我们给大家详细说。首先,我们对照着原始数据表与结果数据表,看原始数据表中有哪些字段是可以直接读取写入到结果数据表中的。此时,大家可能又觉得在原始数据表中的字段都是英文的,看不太明白,可以结合字段解释表去看。但是,看完之后,大家会发现,好像没有一个能够直接匹配上的。细细的观察原始数据表中SUP_P_PARAMS字段,我们发现它是一个键值对类似于字典的数据格式,里面有我们结果数据表所需要的字段。
那简单来说,我们的目的就是将SUP_P_PARAMS中的值读取出来,写入到结果数据表中对应的字段中。明确了目标之后,我们就开始撸代码叭~
import pandas as pd # 导入 pandas 模块
# 读取 笔记本测试数据.xlsx 工作簿中的 原始数据表
df = pd.read_excel("笔记本测试数据.xlsx",sheet_name="原始数据")
df.info()
观察出 SUP_P_PARAMS 列的类型为 object 对象,并且我们来观察该列中每个元素的数据类型。
for i in df["SUP_P_PARAMS"]:
print(type(i))
奥霍,我们发现每个元素的类型为 str。极其不方便我们去通过每个元素的 key 值来获取 value 值。而如果我们想要方便的去实现该操作,则需要使得每个元素的类型为 python 中的 dict 对象。
那此时需要我们思考的是,python 中有什么方法可以将 '{"k":"v"}'
转为 {"k":"v"}
呢?
- dict()方法 ?
- json模块 ?
如果有朋友使用 dict()
的话,那我就要敲你了奥~正确的方式应该是使用 json 模块来完成这个操作。如:
import json
s = '{"k":"v"}'
res = json.loads(s)
type(res)
---------------------
dict
OK,所以现在我们迫不及待的想要对 SUP_P_PARAMS 列中每个元素进行转换了~此时,我们使用 Pandas.Series.apply(f)
将 SUP_P_PARAMS 列中每个元素映射到 f 函数中进行处理。
import json
def f(x):
return json.loads(x)
df["SUP_P_PARAMS"].apply(f)
报错:JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
网上一检索这个异常,简单来说就是 '{"k":"v"}'
数据中含有 '{k:"v"}'
这种模式~ emmm…解决方法是建议将 json.loads(s)
更换为 demjson.decode(txt)
import json
def f(x):
res = demjson.decode(x)
print(type(res))
df["SUP_P_PARAMS"].apply(f)
那接下来,我们就可以通过 key 来获取对应的 value 值了,如:系列
import json
def f(x):
res = demjson.decode(x)
return res["系列"]
df["SUP_P_PARAMS"].apply(f)
报错:KeyError: '系列'
,也就意味着,有些 dict 并不包含"系列"。所以,在获取它之前我们加一个判断,看该键是否在 dict.keys()
中。除此之外,我们需要保证数据的对应,也就是说,当"系列"不存在时,返回 np.nan
。
import json
def f(x):
res = demjson.decode(x)
if "系列" in res.keys():
return res["系列"]
else:
return np.nan
df["SUP_P_PARAMS"].apply(f)
OKK,有了第一个成功,后面其实就都不难~大家会发现,CPU型号等等这些字段的读取处理,好像都是重复的,那我们又需要将 变化
的进行传参了。实际上,如果我们需要给 f
参数进行传参,通过 Pandas.Series.apply(f,args=())
即可。
def f(x,name):
# 将str转为dict
res = demjson.decode(x)
if name in res.keys():
return res[name]
else:
return np.nan
df["SUP_P_PARAMS"].apply(f,args=("系列",))
df["SUP_P_PARAMS"].apply(f,args=("CPU型号-笔记本",))
df["SUP_P_PARAMS"].apply(f,args=("操作系统",))
df["SUP_P_PARAMS"].apply(f,args=("内存容量",))
df["SUP_P_PARAMS"].apply(f,args=("屏幕尺寸-笔记本",))
df["SUP_P_PARAMS"].apply(f,args=("显存容量",))
df["SUP_P_PARAMS"].apply(f,args=("硬盘容量",))
df["SUP_P_PARAMS"].apply(f,args=("服务标准",))
做完数据提取后,接下来直接赋值到结果数据表中即可。
读取结果数据表,进行赋值添加。
# 读取 笔记本测试数据.xlsx 数据
outcome_df = pd.read_excel("笔记本测试数据.xlsx",sheet_name="结果数据")
outcome_df.info()
outcome_df.head()
def f(x,name):
# 将str转为dict
res = demjson.decode(x)
if name in res.keys():
return res[name]
else:
return np.nan
outcome_df["产品系列"] = df["SUP_P_PARAMS"].apply(f,args=("系列",))
outcome_df["CPU型号"] = df["SUP_P_PARAMS"].apply(f,args=("CPU型号-笔记本",))
outcome_df["操作系统"] = df["SUP_P_PARAMS"].apply(f,args=("操作系统",))
outcome_df["内存容量"] = df["SUP_P_PARAMS"].apply(f,args=("内存容量",))
outcome_df["屏幕尺寸-笔记本"] = df["SUP_P_PARAMS"].apply(f,args=("屏幕尺寸-笔记本",))
outcome_df["显存容量"] = df["SUP_P_PARAMS"].apply(f,args=("显存容量",))
outcome_df["硬盘容量"] = df["SUP_P_PARAMS"].apply(f,args=("硬盘容量",))
outcome_df["质保时间"] = df["SUP_P_PARAMS"].apply(f,args=("服务标准",))
# 保存数据集
outcome_df.to_excel("结果数据.xlsx")
这样就实现啦~因为其中有很多空值,所以数据看起来并不是那么美观。包括 质保时间、屏幕尺寸-笔记本 这两列我们可以进行优化,从中提取出 **年
与 **英寸
等。这个大家可以通过 Pandas.Series.str.extract(pattern)
进行正则匹配出来~比较简单,大家就自己实现叭!奥利给
想要获取数据或者学习更多关于python内容的朋友,欢迎关注微信公众号:极客夜读。
标签:数据分析,面试,Python,res,args,df,PARAMS,SUP,apply 来源: https://blog.csdn.net/weixin_44352981/article/details/114662763