ya~老amy来了,今儿给大家分享一个朋友面试数据分析的实战项目,建议大家也可以独立的做一做。

需求如下:

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_字段


看完这,可能第一反应就是头都大了。原始数据?结果数据?标准数据?但是冷静下来,对数据进行观察之后,呈现出下方截图:

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_数据分析_02


图看不明白没事儿,我们给大家详细说。首先,我们对照着原始数据表与结果数据表,看原始数据表中有哪些字段是可以直接读取写入到结果数据表中的。此时,大家可能又觉得在原始数据表中的字段都是英文的,看不太明白,可以结合字段解释表去看。但是,看完之后,大家会发现,好像没有一个能够直接匹配上的。细细的观察原始数据表中SUP_P_PARAMS字段,我们发现它是一个键值对类似于字典的数据格式,里面有我们结果数据表所需要的字段。

那简单来说,我们的目的就是将SUP_P_PARAMS中的值读取出来,写入到结果数据表中对应的字段中。明确了目标之后,我们就开始撸代码叭~

import pandas as pd # 导入 pandas 模块

# 读取 笔记本测试数据.xlsx 工作簿中的 原始数据表
df = pd.read_excel("笔记本测试数据.xlsx",sheet_name="原始数据")
df.info()

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_json_03


观察出 SUP_P_PARAMS 列的类型为 object 对象,并且我们来观察该列中每个元素的数据类型。

for i in df["SUP_P_PARAMS"]:
    print(type(i))

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_json_04


奥霍,我们发现每个元素的类型为 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)

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_json_05


那接下来,我们就可以通过 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)

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_原始数据_06


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")

使用python对不同因素对用户产品评价等级影响分析 python对数据分析影响_原始数据_07


这样就实现啦~因为其中有很多空值,所以数据看起来并不是那么美观。包括 质保时间、屏幕尺寸-笔记本 这两列我们可以进行优化,从中提取出 **年**英寸 等。这个大家可以通过 Pandas.Series.str.extract(pattern) 进行正则匹配出来~