本篇内容关键词:python基础、数据分析、pandas、描述统计、matlibplot、seaborn、可视化分析
都说python是门胶水语言,可以在需要的地方轻松地粘合目标需求。我觉得python的主要优点有两点:
新手可以直接安装Anaconda,这是一个开源的python发行版本,发行版的意思就是在python官方本本的基础上添加了一些额外的内容。这些额外的内容在Anaconda中指的的是:python数据科学计算相关的第三方库、conda(开源软件包和环境管理系统)等。前者集成大多数数据科学计算相关的包,大大节省了学习和使用过程中第三方库安装和配置的时间;后者使得可以在该集成的基础上管理和安装新的第三方库。
水平和时间有限不作总结,推荐两个相关的教程:
pandas是什么? pandas是一个能提供高效处理结构化数据的数据结构和函数(方法)。
pandas 有两种数据结构,DataFrame和Numpy。为什么要单独创造新的数据结构呢?python自身的数据结构不好用吗?新数据结构有什么优势呢?答案是:新的数据结构好用得飞起,
这两种结构可以进行矩阵运算,这就意味着一些数学矩阵的处理可以被快速地完成,以及快速地进行查询并赋值;
pandas提供了一系列的数据处理的函数(方法),例如从数据读取、数据预处理、数据分析和数据可视化都有相应的函数。值得注意的是,sql中的一些数据处理操作也可以轻易地实现,例如连接(join)操作,分组(groupby)等,都可以通过简洁易维护的代码实现。
# 以下时简单示例,不做过多的介绍
import pandas as pd
# 读取文件test.xlsx 中 sheet名为测试数据 的数据,数据中有列名 header 设置为真。
data = pd.read_excel('test.xlsx',sheet_name = '测试数据',header = True)
import pandas as pd
import numpy as np
# 1.通过“列表”初始化:列表可以是:等长的numpy多维数组、等长的多维的list
dates = pd.date_range('20190728', periods=3)
df1 = pd.DataFrame(np.random.randn(3, 4), index=dates, columns=list('ABCD'))
df1
# 2.通过“列表”组成的字典初始化:等长的numpy多维数组、等长的多维的list
data = {'A':{'20190728':1,'20190729':1,'20190730':1},
'B':{'20190728':2,'20190729':2,'20190730':2},
'C':{'20190728':3,'20190729':3,'20190730':3},
'D':{'20190728':4,'20190729':4,'20190730':4}
}
# 通过 columns指定获取数据的列和顺序(显式列索引 > 数据列索引)
df2 = pd.DataFrame(data,columns = ['D','C','B'])
df2
# 查看数据属性,列名和对应数据格式
df.info()
# 查看数据本身 前10条、最后10条和随机10条
df.head(10)
df.tail(10)
df.sample(10)
通过label(行/列名)、位置(数字坐标)、布尔运算
# 1.通过label(行标签) loc(行标签 :index) iloc(int类型 列标签(默认顺序,从0开始)
df1 = pd.DataFrame(np.random.randn(6,3),index=list('abcdef'),columns=['col1','col3','col88'])
# 1.1.获取index为 a 到index为c的三行数据
df1.loc['a':'c']
# 1.2获取顺序第0行和第1行的两行数据
df1.iloc[0:2]
# 1.3通过位置切片,行和列都切割
df1.iloc[0:2,0:2]
#通过布尔运算切片,筛选出col3值小于0的数据。
df1[df1.col3<0]
#通过布尔运算切片,筛选出col3值小于0的数据,只取指定列。
df1[df1.col3<0][['col3','col88']]
可参考官方文档:Indexing and Selecting Data
# 切片 见2.2.2
# 排序 按照列col1降序排列
df2 = df1.sort_values(['col1'], ascending=False)
# 合并:append、join、merge
# 新构造数据df3,强行以“追加”的方式合并,忽略原始的index
df3 = pd.DataFrame(np.random.randn(6,3),index=list('fpqrst'),columns=['col1','col3','col2'])
df_data = df3.append(df2,ignore_index=True)
# 按照特定列 join,可以指定连接方式、重合列明的标识。
df4 = pd.DataFrame(np.random.randint(1,5,size = (3,3)),index=list('fpq'),columns=['col5','col1','col2'])
df5 = pd.DataFrame(np.random.randint(1,5,size = (3,3)),index=list('fpq'),columns=['col6','col1','col2'])
df_join = df4.join(df5.set_index('col1'),on='col1',how='left',lsuffix = '_L',rsuffix = '_R')
# merge 自行参考文档,笔者几乎没用过
# 行列转置
data = {"小明":{"语文":90,"数学":90,'英语':110},
"小红":{"语文":60,"数学":100,'英语':120},
"小黑":{"语文":10,"数学":100,'英语':110}}
df_fenshu = pd.DataFrame(data)
# 将索引转为新的列,方便行列转置
df_fenshu.index.name = '科目'
df_fenshu = df_fenshu.reset_index()
# 转置再转置
df_pivot_pivot_table = df_pivot_table.pivot_table(values = ['数学','英语','语文'],columns = '姓名')
df_pivot_pivot_table = df_pivot_pivot_table.reset_index()
df_pivot_pivot_table
# 强制类型转换 int float category datetime64[ns] datetime64
df_pivot_pivot_table.科目.astype('category')
# 缺失值定位
# 返回单元格级别的缺失值信息
df_data.isnull()
# 返回列级别的 缺失值信息
df_data.isnull().any()
# 返回存在缺失值的记录
df_data[df_data.isnull().values==True]
# 缺失值填充
# 填0
df_data.fillna(0)
# 按照列区别填充
values = {'col2': 22222, 'col3': 1, 'col88': 88888}
df_data.fillna(value = values)
# 删除存在缺失值的记录,axis 为0 表示行
df_data.dropna(axis = 0)
# 赋值 按位置、按条件、按行/列
df_data.loc['p':'t'] = 9999
df_data.iloc[6:9,0:2] = -5555
df_data.loc['c'] = 30000
df_data.iloc[:,3] = 77777
df_data
# 可以直接进行四则运算,会自动对齐index相同的数据,indexi不同则没有结果。
df4 + df5
df4 - df5
df4 * df5
df4 / df5
df_data.describe()
df_data.col1.mean()
df_data.col1.median()
df_data.col1.max()
# 百分位数
df_data.col1.quantile(0.5)
df_data.col1.sum()
df_data.col1.var()
df_data.col1.std()
df_data.col1.skew()
# 累计求和(cum 累计系列)
df_data.col1.cumsum()