一、数据分析常用开源库
Pandas
基于Numpy - 特点高效的科学计算库, 核心的数据对象 是 ndarray n维数组
Series 一列数据
DataFrame 二维表
绘图的库最基础的 Matplotlib
Pandas 有绘图的API 基于 Matplotlib
Seaborn 基于 Matplotlib
二、Notebook的使用
在控制台启动 anaconda prompt
jupyter notebook
在Pycharm中使用 给项目添加Python解释器, 使用conda enviroment
然后,在项目的目录下新建一个Notebook
启动之后可能遇见的问题
弹窗口, jupyter进程直接杀死, 报错是bad file descriptor
是pyzmq包的问题, 把它卸载掉, 再重装一下就好了
pip uninstall pyzmq
pip install pyzmq
三、Pandas 数据结构
3.1 Series的创建
pd.Series()
S大写
传入一个、两个参数
第一个参数就是数据, 也可以通过index = 指定行索引
如果不指定行索引, 会默认添加从0开始的索引
传入的数据可以是以下类型
numpy的ndarray
python 列表,元组,字典
传入的如果是字典, 字典的key作为索引, Value就是数据
一列Series数据类型必须一致的
如果既有字符串, 又有数字, 会是字符串类型 Object
3.2 Series属性
s.shape # 形状 描述series有几行 返回一个元组
s.values # Series的值 默认ndarray类型
s.index # Series的索引, 如果手动指定, 就是一个ndarray类型, 如果是自动生成 rangeIndex()
3.3 Series的常用方法
head()
tail()
to_list() # 转换成列表
to_frame() #转换成DF
describe() # 加载数据之后, 首先可以先head() 再 describe 看数据的分布情况
count()
std() # 标准差 方差 = ∑(一列数据的每一个值- 均值)²/M 标准差 = 方差开根号 反映了数据的离散程度
mean()
min()
max()
计算了三个分位数( 25% 50% 75%)
50% 中位数
对数据进行修改的方法, 99%都有一个共同的参数 inplace 默认值是False
修改数据的API默认不会再原始的数据上进行修改, 而是会在副本上进行修改, 并且会把这个修改后的副本作为方法的返回值, 返回来
如果inplace 修改为True 就会在原始的数据上进行修改, 此时这个方法没有返回
去重 drop_duplicates
排序 sort_values()
参数 ascending=False 降序排列unique() 返回唯一值的列表
s1.value_counts() 相当于分组计数, 统计每个取值出现的次数, 默认会按照取值多少做降序排列
3.4 布尔索引(布尔值列表做数据筛选)
加载数据之后, 要取出年龄大于平均年龄的人名
df['Name'][df['Age']>df['Age'].mean()]
- DataFrame 可以看作是由Series组成的列表, df[列名] 类似于 列表通过下标取值
- df['Name'][由布尔值组成的列表/Series] 这种写法类似于SQL的where条件
需要注意 df['Age']>df['Age'].mean() 长度 要跟 df['Name']长度一致, 否则会报错
3.5 Series的运算
Series和一个值进行计算
数值类型 做加减乘除, Series中的每一个元素都跟这个值做加减乘除, 不需要写循环
字符串类型 可以和数值做乘法, 相当于复制, 乘以2 复制一份
两个Series之间进行计算,根据行索引进行对齐
如果两行行索引一样, 就可以在一起计算
如果两行行索引不一样,不能在一起算, 如果一个Series里有的行索引, 另一个Series没有, 返回NaN
Series做各种计算
3.6 DataFrame的创建和常用属性
pd.DataFrame()
-
可以传入字典 {‘列名’:[值1,值2, 值3],‘列名2’:[值1,值2, 值3]}
-
也可以传入列表套列表,列表套元组
-
data = [[],[], []]
-
-
创建df的时候, 可以通过index 指定行索引 columns指定列名
常用属性
-
shape (行数,列数)
-
index 行索引
-
values 值, ndarray(注意 pandas2.0以后, 底层调用的运算库,可以不是numpy了, 可以选择pyarrow)
-
columns 列
3.7 DataFrame的常用方法
df.info()
-
加载数据之后, 做具体的业务处理之前, 一般固定的套路
-
head() 看数据长什么样
-
info() 字段有哪些, 有没有空值, 每个字段的数据类型
-
describe() 数据的分布 默认会展示数值类型的统计量
-
include = object 显示字符串类型的分布情况
-
count 计数,unique 唯一值的数量, top出现次数最多的字符串是啥 freq 出现次数最多的字符串出现的频率(次数)
-
-
df.head()/tail()
df.min()算最小/df.max()算最大/df.mean()取平均/df.count() 计数
3.8 DataFrame的布尔索引取部分值
使用方法和Series是一样的, 只不过在条件前面的对象是一个dataframe
如果要使用多个条件进行筛选,按照下面方法写
df_sci[(df_sci['Age']>df_sci['Age'].mean()) | (df_sci['Occupation']=='Chemist')]
多个条件,同时计算, 每个条件都要用()括起来
多个条件之间,要用位运算的符号 同时满足 & 满足一个就可以 |
& 对应的还有and 运算符 | 对应or 如果是两个Series之间进行计算, 要用位运算 & | 不能用 and or
(df_sci['Age']>df_sci['Age'].mean()) or (df_sci['Occupation']=='Chemist')
报错:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
and or 只能在一个True、False 和 另一个True/False之间进行计算
3.9 DataFrame之间的计算
-
和Series之间的计算 没有区别, 参见series的计算
四 读取保存Excel和CSV文件
读取文件的API pd.read_XXX XXX→ 文件格式 excel , csv, json,sql
保存文件的API df.to_XXX XXX→ 文件格式 excel , csv, json,sql
to_excel
df.to_excel('test3.xlsx',sheet_name='student',index=False,header=False) # 第一个参数路径 sheet_name 表格下边工作簿的名字 # index=False(默认是True) 不保存行索引 header=False(默认是True) 不保存列名
to_csv
参数基本跟excel一样, 没有sheet_name
特殊的参数 sep 分隔符, 默认是逗号, 可以修改成其它的比如
df.to_csv('test3.csv',index=False,sep='\t') # '\t'制表符作为分隔符 # 加载数据的时候, 也要指定对应的分隔符 pd.read_csv('test3.csv',sep='\t')