从数据源读取数据的方法
常见的数据源
从Excel中读取数据
使用
1 | pd.read_excel(r'文件路径') # 在jupyter中将光标放到括号里面,使用shift+tab来获取函数的帮助信息 |
来读取指定位置xlsx文件的数据
如何方便的找到其他目录下的某个文件
1 | import os |
如何读取Excel文件中指定sheet的数据
1 | df2 = pd.read_excel(r'路径.xlsx', |
针对没有数据标题的数据表,必须指定header = None
1 | df2 = pd.read_excel(r'路径.xlsx', |
指定第一列作为行标签的方法
1 | df2 = pd.read_excel(r'路径.xlsx', |
修改默认列标签为自定义列标签
1 | df2 = pd.read_excel(r'路径.xlsx', |
指定只读取多少行
1 | df2 = pd.read_excel(r'路径.xlsx', |
只导入指定的列
1 | df2 = pd.read_excel(r'路径.xlsx', |
指定省略行
1 | df2 = pd.read_excel(r'路径.xlsx', |
从CSV中读取数据
使用
1 | df = pd.read_csv(r'文件路径') # 读取csv文件 |
读取含有中文的csv文件
1 | df = pd.read_csv(r'文件路径_文件内含中文', engine = 'python') # 读取csv文件 |
如果是非逗号分割的csv文件的读取
1 | df = pd.read_csv(r'文件路径_#作为分隔符', sep = '#') # 读取csv文件, csv以#分割列 |
读取文本文件(txt)
使用
1 | df = pd.read_table(r'文件路径_含中文', engine = 'python') # 读取txt文件 |
读取含中文的文件,如果不含中文,则不需要指定engine参数
处理特殊分列符
1 | df = pd.read_table(r'文件路径_含中文', engine = 'python', sep = '@') # 读取txt文件, 列之间以@分割 |
数据预处理阶段(数据清洗)
数据预处理一般包括以下五个方面:
- 缺失值处理
- 重复值处理
- 异常值处理
- 数据类型转换
- 索引设置
缺失值处理
如果数据集比较大,缺失值占比较小的话可以直接删除,如果数据集较小,则不能直接删除。常见的处理方法
- 填充一个平均值(年收入)
- 填充一个众数(上下班打卡)
- 最小值(商品价格)
- 平均值
- 最大值(保险收益)
第一步:查看缺失值(不直接查看源文件)
1 | df = pd.read_excel(r'filename.xlsx') |
第二步(方法1):删除缺失值
1 | df.dropna() # 删除所有含有NaN的行(创建副本的方式,非原地修改),可以使用inplace = True参数 |
可以指定axis参数,如果axis = 1,则会删除含有NaN的列,如下:
1 | df.dropna(axis = 1) # 删除所有含有NaN的列(创建副本的方式,非原地修改),可以使用inplace = True参数 |
指定当某行所有值全为NaN时才删除,如下:
1 | df.dropna(how = 'all') # how 参数默认为any,即有任何NaN则删。 |
第二步(方法2):填充缺失值(缺失值使用文字填充,如‘暂无’)
首先是替换(如果需要)
1 | df2 = pd.read_excel(r'filename.xlsx', na_values = '暂无') # 将‘暂无’替换成NaN(读取时直接将‘暂无’替换成缺失值) |
注意:Pandas中只要涉及DataFrame修改的操作全部都是创建副本的形式,也就是非原地修改,需要指定inplace = True,目的是防止用户误操作数据
其次是替换插值(使用平均值)
1 | df['售价'] = df['售价'].apply(lambda x : str(x).replace('万', '') if x is not np.nan else x) # 将数值后面的单位去掉 |
重复值处理
重复值一般作为删除处理
1 | df = pd.read_excel(r'重复值处理.xlsx') # 读取数据 |
异常值处理
异常值就是相比正常数据而言过高或过低的数据
异常值的特征
- 异常值并不是错误值,他和正常范围的数据偏离较大
- 异常值出现的频率低,但又会对实际的项目分析造成偏差
- 异常值一般采取盖帽法或数据离散化进行处理
异常值的检测
- 根据业务经验来判断(粗筛,数据量小)
- 根据数据的分布形态,如果数据服从正态分布,就可以利用3σ原则:如果一个数值与平均值之间的偏差超过3倍标准差,那么就可以认为这个值是一个异常值
- 对于不服从正态分布的数据,通过绘制箱型图,把大于/小于箱型图上边缘/下边缘的点称为异常值(对数据没有特别要求)
对于符合正态分布的异常点的检测
1 | # 首先通过画图来判断是否符合正态分布 |
根据箱型图的规律判断异常点
1 | df = pd.read_csv(r'non-normal.csv', index_col = 0) |
在箱型图中,上四分位数为Q3,下四分位数记录为Q1,则上界的计算公式为:Q3 + 1.5 \ (Q3 - Q1),下界的计算公式:Q1 - 1.5 * (Q3 - Q1)。其中(Q3 - Q1)表示四分位差*
1 | Q1 = df.Count.quantile(q = 0.25) # 求分位数函数 |
数据类型转换
一般打开文件获取到的都是object类型的数据,所以需要数据类型转换
1 | df = pd.read_excel(r'数据类型转换.xlsx') |
索引设置
主要分为添加索引和设置索引。当数据集中缺少行索引、列索引时,可以添加索引
1 | df = pd.read_excel(r'索引设置.xlsx', header = None) |
数据选择
列选择
1 | df = pd.read_excel(r'数据类型转换.xlsx') |
注意:如果不指定列,那么所有的列都会参与,如下
1 | df.iloc[[0, 2, 4]] # 不指定列参数就是所有列 |
通过标签来选择行
1 | df.loc[2] # 通过标签来选择,方括号内填写的是行标签 |
注意:如果更改了行标签,则不能用数字进行访问,只能用修改后的标签来访问,如下
1 | df.set_index('日期', inplace = True) |
注意:只有iloc才可以通过index访问,loc只能通过标签值来访问
按条件来选择行
1 | df[df['售价'] > 30] # 将‘售价’这一列中所有大于30的行选择出来 |
交叉索引 df.ix
1 | df.ix[[0:3], ['部门', '身高']] # 即将被遗弃的方法 |