本文解决的是2类目标业务:
- 有数据不知道怎么做数据分析操作的。
- 自己有思路不知道怎么落地实现的。
Python数据分析基础必用品
- office软件(推荐2016版)
- Python开发环境(推荐Anaconda,对新手友好)
牢记的数据分析路线
- 采集生成需要分析的数据表单,或者从数据库中提取。
- 数据基础信息检查。
- 数据表清洗&预处理。
- 有效数据特征筛选&提取。
- 数据统计分类&汇总&透视。
- 算法模型应用
逐一进行讲解分析,划重点
- 采集生成需要分析的数据表单,或者从数据库中提取。
Python 支持从多种类型的数据导入。需要先导入 pandas 库和导入 numpy 库。
import pandas as pd
import numpy as np
使用pandas导入表单
df=pd.DataFrame(pd.read_csv('table.csv',header=1))
df=pd.DataFrame(pd.read_excel('table.xlsx'))
- 数据基础信息检查。
#查看数据表的维度
df.shape
#数据表信息
df.info()
#查看数据表各列格式
df.dtypes
#检查数据空值
df.isnull()
#检查特定列空值
df['column_name'].isnull()
#查看 city 列中的唯一值
df['column_name'].unique()
#查看数据表的值
df.values
#查看列名称
df.columns
#查看前 0 行数据
df.head(0)
#查看后 0 行数据
df.tail(0)
- 数据表清洗&预处理。
#删除数据表中含有空值的行
df.dropna(how='any')
#使用数字 0 填充数据表中空值
df.fillna(value=0)
#使用 column_name 均值对 NA 进行填充
df['column_name'].fillna(df['column_name'].mean())
#清除 column_name 字段中的字符空格
df['column_name']=df['column_name'].map(str.strip)
#column_name 列大小写转换
df['column_name']=df['column_name'].str.lower()
#更改数据格式
df['column_name'].astype('int')
#更改列名称
df.rename(columns={'column_name': 'new_column_name'})
#删除后出现的重复值
df['column_name'].drop_duplicates()
#数据替换
df['column_name'].replace('python', 'Python')
#数据表匹配合并,inner 模式
df_inner=pd.merge(df,df,how='inner')
#设置索引列
df_inner.set_index('column_name')
#按特定列的值排序
df_inner.sort_values(by=['column_name'])
#按索引列排序
df_inner.sort_index()
# 数据分组
# 如果 column_name 列的值>3000,group 列显示 high,否则显示 low
df_inner['column_name'] = np.where(df_inner['column_name'] > 3000,'high','low')
#对复合多个条件的数据进行分组标记
df_inner.loc[(df_inner['column_name'] == 'Python') & (df_inner['column_name'] >= 4000), 'sign']=1
#数据分列
#对 column_name 字段的值依次进行分列,并创建数据表,索引值为 df_inner 的索引列,列名称为 column_name 和 column_name_size
pd.DataFrame((x.split('-') for x in df_inner['column_name']),index=df_inner.index,columns=['column_name','column_name_size'])
#将完成分列后的数据表与原 df_inner 数据表进行匹配
df_inner=pd.merge(df_inner,split,right_index=True, left_index=True)
- 有效数据特征筛选&提取。
#按索引提取单行的数值
df_inner.loc[3]
#按索引提取区域行数值
df_inner.loc[0:5]
#重设索引
df_inner.reset_index()
#设置日期为索引
df_inner=df_inner.set_index('date')
#提取 4 日之前的所有数据
df_inner[:'03-0-04']
#使用 iloc 按位置区域提取数据
df_inner.iloc[:3,:]
#使用 iloc 按位置单独提取数据
df_inner.iloc[[0,,5],[4,5]]
#使用 ix 按索引标签和位置混合提取数据
df_inner.ix[:'03-0-03',:4]
#按条件提取(区域和条件值)
#判断 column_name 列的值是否为 Python
df_inner['column_name'].isin(['Python'])
#提取前三个字符,并生成数据表
pd.DataFrame(category.str[:3])
#使用“与”条件进行筛选
df_inner.loc[(df_inner['column_name'] > 5) & (df_inner['column_name'] == 'Python'),
#对筛选后的数据按 column_name 字段进行求和
df_inner.loc[(df_inner['column_name'] > 5) | (df_inner['column_name'] == 'Python'),
#使用“非”条件进行筛选
df_inner.loc[(df_inner['column_name'] != 'Python'), ['id','column_name','column_name2','column_name3','column_name4']].sort(['id'])
#对筛选后的数据按 column_name 列进行计数
df_inner.loc[(df_inner['column_name'] != 'Python'), ['id','column_name1,'column_name2','column_name3','column_name4']].sort(['id']).column_name.count()
# 使用 query 函数进行筛选
df_inner.query('column_name == ["Python", "Java"]')
#对筛选后的结果按 column_name 进行求和
df_inner.query('column_name == ["Python", "C++"]').column_name.sum()
- 数据统计分类&汇总&透视。
#对所有列进行计数汇总
df_inner.groupby('columns_name').count()
#对特定的 ID 列进行计数汇总
df_inner.groupby('columns_name')['id'].count()
#对两个字段进行汇总计数
df_inner.groupby(['columns_name','columns_name3'])['id'].count()
#对 columns_name 字段进行汇总并计算 price 的合计和均值。
df_inner.groupby('columns_name')['columns_name'].agg([len,np.sum, np.mean])
#数据透视表
pd.pivot_table(df_inner,index=["columns_name"],values=["columns_name"],columns=["columns_name"],aggfunc=[len,np.sum],fill_value=0,margins=True)
#简单的数据采样
df_inner.sample(n=3)
#手动设置采样权重
weights = [0, 0, 0, 0, 0.5, 0.5]
df_inner.sample(n=, weights=weights)
#采样后不放回
df_inner.sample(n=6, replace=False)
#采样后放回
df_inner.sample(n=6, replace=True)
#数据表描述性统计
df_inner.describe().round().T
#两个字段间的标准差
df_inner['columns_name'].std()
#两个字段间的协方差
df_inner['columns_name'].cov(df_inner['m-point'])
#相关性分析 协方差/标准差
df_inner['columns_name'].corr(df_inner['m-point'])
#输出到 CSV 格式
df_inner.to_csv('excel_to_python.csv')