#!/usr/bin/env python # coding: utf-8 # In[31]: # P31 导入文件 import pandas as pd df = pd.read_csv('/Users/emmett/Downloads/tel_data.csv') print(df.head(10)) # 从上面的结果可以看出,这个文件一共有21列内容,有的是数据,有的是字符。 # In[32]: # P32 检查文件中是否有缺失值 df.isnull() # 可以看到,所有没有缺失的单元格被标上了False。如果该单元格缺失,会被填上True。 # 但是这里,我们没有办法看到所有单元格的情况,我们按列进行统计看看。 # In[33]: # 按行求和,所有的False会被转化为0,所有True会被转化为1,如果一整列都是0,说明该列没有缺失。 df.isnull().sum() # In[34]: # P33 对数据类型进行修正 df.info() # In[35]: # 在以上的结果中我们发现TotalCharges这一列的数据类型是object,然而这一列应该是数字。肯定是其中混入了一些不是数字的元素,我们对这一列进行统计频次,看看这一列都是啥东西。 df["TotalCharges"].value_counts() # In[36]: # 发现:有个含空格的单元格出现了11次。现在把这些空单元格替换为这组数据的中位数。 # 中位数 median = df["TotalCharges"][df["TotalCharges"] != " "].median() # 将median填到空格里 df.loc[df["TotalCharges"] == " ", "TotalCharges"] = median # 再把整列的数据类型修改为float df["TotalCharges"] = df["TotalCharges"].astype(float) # 检查 df["TotalCharges"].value_counts() # In[37]: # P34 将数字类型外的其他列都改成分类变量(category) # 先看下都有哪些列 df.columns # In[38]: # 只有tenure, MonthlyCharges, TotalCharges是数字类型(float),其他的都改成分类变量(categorical) # 先把这三列的列名挑出来 number_columns = ["tenure", "MonthlyCharges", "TotalCharges"] for column in number_columns: df[column] = df[column].astype(float) # 修改其他列 set的减法:所有列名的set减去number_columns的set for column in set(df.columns) - set(number_columns): df[column] = pd.Categorical(df[column]) # 再查看每一列的数据类型 df.info() # In[39]: # P35 Describe描述所有分类变量的列 df.describe(include=["category"]) # 这里和数据类型的describe结果是不一样的 # # count表示了所有的个数,unique表示种类数,也就是去重之后的,比如gender里面,只有男女,所以unique是2。Top和freq是最多的分类和对应的频数。 # In[40]: # P36 看某一列的数据分布 df["Churn"].value_counts() # In[41]: # P37 多维度查看月费字段统计 # Churn:用户是否流失 # PaymentMethod:支付方式 # MonthlyCharges:月费 # 查看按照Churn、PaymentMethod两个指标分组后的月费均值 df.groupby(["Churn", "PaymentMethod"])["MonthlyCharges"].mean() # 从这里可以很明显的的发现,无论是哪种支付方式,用户流失了(Churn=Yes)的月费均值都大于未流失的。这就是隐藏在数据中的规律。 # In[42]: # P38 Churn字段的数据映射 # 需要把Yes/No转化为1-0数据,这对于机器学习数据的处理是一个很有用的操作 df["Churn"] = df["Churn"].map({"Yes":1,"No":0}) df["Churn"].value_counts() # 这和之前对于Churn的描述是一致的,只不过No被替换为了0,Yes被替换为了1。 # In[43]: # P39 查看字段的相关性矩阵 # 统计DataFrame的相关性矩阵 df.corr() # 可以发现,相关性矩阵只会通过数值型的变量来计算。 # In[44]: # P40 数据的采样 # 随机挑选一定的行数 df.sample(10)