文章目录
Pandas
参考文档+视频
https://www.bilibili.com/video/BV1UJ411A7Fs?from=search&seid=17171920844600886831
跳转链接
pandas:Python数据类库,数据分析、数据处理、数据可视化
numpy:用于数学计算
scikit-learn:用于机器学习
公共方法
df代表DataFrame对象
series代表Series对象
pd代表pandas库对象
# 读取文件/数据库
pd.read_csv()
pd.read_excel() # skiprows=int,读取时,忽略前int个空行
pd.read_sql()
# 将数字字符串替换为int类型,例如:30℃替换为30
df.loc[:,'wendu'] = df['wendu'].str.replace('℃','').astype('int32')
# 查看dataframe前几行数据
df.head(int) # 括号里面可以指定行数
# 查看数据的形状,返回(行数、列数)
df.shape
# 查看列名列表
df.columns
# 查看索引
df.index
series.index
# 设置索引为指定列名
df.set_index('列名',inplace=True/False)
# 查看列标签以及列数据的类型
df.dtypes
# 获取数据
series.values
df.values
# 查看pd版本号
pd.__version__
# 查看某一列数值类型的计数情况
df['col'].value_counts()
1 set_index()
https://zhuanlan.zhihu.com/p/110819220?from_voters_page=true
跳转链接
df.set_index(keys, drop=True, append=False, inplace=False, verify_integrity=False)
参数解释:
**keys:**列标签或列标签/数组列表,需要设置为索引的列
**drop:**默认为Ture,删除用作新索引的列
append:是否将列附加到现有索引,默认为False
**inplace:**输入布尔值,表示当前操作是否对原数据生效,默认为False
**verify_integrity:**检查新索引的副本。否则,请将检查推迟到必要时进行。将其设置为false将提高该方法的性能,默认为false
01 什么是Pandas
pandas:Python数据类库,数据分析、数据处理、数据可视化
使用Python类库集成安装包:anaconda
- https://www.anaconda.com
- pip install panda
使用jupyter notebook调试代码
02 数据读取
- 先读取表格类型的数据
数据类型 | 说明 | Pandas读取方式 |
---|---|---|
csv、tsv、txt | 用逗号分隔、tab分割的纯文本文件 | pd.read_csv |
excel | 微软xls或者xlsx文件 | pd.read_excel |
mysql | 关系型数据库表 | pd.read_sql |
- 进行分析处理
- 保存
- to_csv()
- to_read_excel()
- to_sql()
03 数据结构
DataFrame:二维数据,整个表格,多行多列
Series:一维数据,一行或一列
1 Series
- Series是一种类似于一维数组的对象,由一组数据(不同数据类型)以及一组与之相关数据标签(索引)组成。
1.1 Series创建
import pandas as pd
# 使用列表
pd.Series([1,'a',2,5.7])
# 列表+指定索引
pd.Series([1,'a',2,5.7],index=['d','b','a','c'])
# 使用字典
sdata = {'a':1,'b':2,'c':3,'d':4}
pd.Series(sdata)
1.2 Series查询数据
# Series查看列a
series['a']
# 同时查看多列a和b
series[['a','b']
2 DataFrame
- DataFrame是一个表格型的数据结构
- 每列可以是不同的值类型(数值、字符串、布尔型等)
- 既有行索引index,也有列索引columns
- 可以被看做由Series组成的字典
- 创建dataframe最常用的方法是直接读取
2.1 创建dataframe
# 字典序列
data={
'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
'year':[2000,2001,2002,2001,2002],
'pop':[1.5,1.7,3.6,2.4,2.9]
}
pd.DataFrame(data)
2.2 Data查询数据
- 如果只查询一行、一列,返回的是pd.Series数据对象
- 如果查询多行、多列,返回的是pd.DataFrame数据对象
# 查询一行
df['row']
df.loc[1]
# 查询多行
df.loc[1:3]
# 查询一列
df['col']
# 查询多列
df[['col_1','col_2']]
04 查询数据
1 查询数据的几种方法
- df.loc方法:根据行、列的标签值进行查询(既能查询又能覆盖写入)
- df.iloc方法:根据行、列的数字位置进行查询
- df.where方法
- df.query方法
2 使用df.loc查询数据的方法
- 使用单个label值查询数据
- 使用值列表批量查询
- 使用数值区间进行范围查询
- 使用条件表达式查询
- 使用函数查询
注意:
- 以上查询方法既适用于行,也适用于列
- 注意观察降维dataFrame>Series>值
2.1 使用单个label值查询数据
行或者列,都可以只传入单个值,实现精确匹配
# 得到单个值
df.loc['row','col'] # a为行索引名,b为列名
# 得到一个series
df.loc['row',['col_1','col_2']]
2.2 使用值列表批量查询
# 得到series
df.loc[['row_1','row_2','...'],'col']
# 得到df
df.loc[['row_1','row_2'],['col_1','col_2']]
2.3 使用数值区间进行范围查询
注意:区间既包含开始,也包含结束
# 行index按区间查询
df.loc['row_start':'row_end','col']
# 列index按区间
df.loc['row','col_start':'col_end']
# 行和列都按区间查询
df.loc['row_start':'row_end','col_start':'col_end']
2.4 使用条件表达式查询
bool列表的长度要等于行数或者列数
# 简单条件表达式查询
# df['col']<int是一个bool值得series
df.loc[df['col']<int,:] # :代表显示所有列
# 复杂条件查询
df.loc[(df['col_1']<int)&(df['col_2']>int)&(df['col_3']==int), :]
2.5 使用函数查询
直接写lambda表达式
df.loc[lambda df:(df['col_1']<=int)&(df['col_2']>=int),:]
编写自己的函数
def query_my_data(df):
return df.index.str.startswith('row')&(df['col']==1)
df.loc[query_my_data,:]
05 新增数据列
在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析
- 直接赋值
- df.apply方法
- df.assign方法
- 按条件选择分组分别赋值
1 直接赋值
修改df其中一列的数据
# 下面三个对象都为series
df.loc[:,'new_col'] = df['col_2'] - df['col_3']
2 df.apply方法
沿着数据帧的轴应用一个函数。
传递给函数的对象是序列对象,其索引是数据帧的索引(axis=0)或数据帧的列(axis=1)。
def get_wendu_type(df):
if df['col_1'] > int:
return '高温'
if df['col_2'] < int:
return '低温'
return '常温'
# axis=1表示列,0表示行,这里要修改的是列数据
df.loc[:,'new_col'] = df.apply(get_wendu_type,axis=1)
# 查看温度类型的计数
df['new_col'].value_counts()
3 df.assign方法
给数据帧分配新的列。
返回一个新对象,其中包含除了新列之外的所有原始列。
# 可以同时添加多个新的列,列名为new_col_1_name和new_col_2_name
df.assign(
new_col_1_name = lambda df:df['col_1']*int,
new_col_2_name = lambda df:df['col_2']*int
)
4 按条件选择分组分别赋值
按条件先选择数据,然后对这部分数据赋值新列
# 行为条件表达式筛选出特定的列并直接赋值
df['new_col'] = ''
df.loc[df['col_1']-df['col_2']>int,'new_col'] = '温差大'
df.loc[df['col_1']-df['col_2']<int,'new_col'] = '温差小'
06 统计函数
- 汇总类统计
- 唯一去重和按值计数
- 相关系数和协方差
1 汇总类统计
# 一下子提取所有数字列并统计结果
df.describe()
# 查看某一列/多列的平均值
df['col'].mean()
df[['col_1','col_2']].mean()
# 查看某一列/多列的最大值
df[['col_1','col_2']].max()
# 查看某一列/多列的最小值
df[['col_1','col_2']].min()
2 唯一去重和按值计数
2.1 唯一性去重
一般不用于数值列,而是枚举、分类列
注意:df对象没有unique方法,series才有
df['col'].unique()
2.2 按值计数
df['col'].value_counts()
3 相关系数和协方差
如何通俗理解相关系数和协方差:
https://www.zhihu.com/question/20852004/answer/134902061
点击跳转
用途(超级厉害):
协方差covariance:衡量同向反向
相关系数correlation:衡量同向或反向中的相似程度
注意:无论是协方差方法还是相关系数方法,只会应用在数值列上
# 协方差矩阵
df.cov()
# 相关系数矩阵
df.corr()
# 单独查看某一列与另外一列的相关系数
df['col_1'].corr(df['col_2'])
# 查看某一列与其他两列之间统计后的相关系数
df['col_1'].corr(df['col_2']-df['col_3'])
07 对缺失值的处理
使用以下这些函数处理缺失值
-
isnull和notnull:检查是否是空值,可用于df和series
-
dropna:丢弃、删除缺失值
- axis:删除行还是列,0/‘index’,1/‘columns’,default 0
- how:any:任何值为空都删除,all:所有值为空才删除
- inplace:True:修改当前df,False:返回新的df
-
fillna:填充空值
- value:用于填充的值,可以是单个值或者字典(key是列名,value是值)
- method:ffill:使用前一个不为空的值来填充当前值,bfill:使用后一个不为空的值来填充当前值
- axis:按行还是按列来填充,0/‘index’,1/‘columns’
- inplace:True:修改当前df,False:返回一个新的df,default:False
1 检查空值
# 检测df中那个value是为空值,空值则为True,否则为False,返回对象还是df
df.isnull()
# 检测series
df['col'].isnull()
# notnull()与isnull()作用相反
2 对空值的行或列做处理
# 筛选没有空数据的所有行
df.loc[df['col'].notnull(),:]
# 删除掉全是空值的列
df.dropna(axis='columns',how='all',inplace=True)
# 删除只要有一个value是空的列
df.dropna(axis='columns',how='any',inplace=True)
# 删除全是空值的行
df.dropna(axis='index',how='all',inplace=True)
3 将value为空的进行填充处理
# 将某一列中value为空的值填充为指定值
df.fillna({'col':0})
# 等同于下面
df.loc[:,'col'] = df['col'],fillna(0)
# 使用ffill/bfill,缺失值由前面的有效值进行填充
df.loc[:,'col'] = df['col'].fillna(method='ffill')
08 数据排序
Series的排序
Series.sort_value(ascending=True,inplace=False)
参数说明:
- ascending:默认为True升序排序,False为降序排序
- inplace:修改原始Series或返回一个修改后的新series对象
DataFrame的排序
DataFrame.sort_values(by,ascending=True,inplace=False)
参数说明:
- by:字符串或者List<字符串>,单列排序或者多列排序
- ascending:bool或者List,升序还是降序,如果是list则对应by的多列
- inplace:是否修改原始的DataFrame
1 Series的排序
# 默认升序排序且不返回一个新的series对象
df['col'].sort_values()
2 DataFrame的排序
# 单列降序排序
df.sort_values(by="col",ascending=False)
# 多列升序排序
df.sort_values(by=['col_1','col_2'])
# 多列分别指定升序和降序
df.sort_values(by=['col_1','col_2'],ascending=[True,False])
09 字符串处理
https://pandas.pydata.org/pandas-docs/stable/reference/series.html#string-handling
点击跳转
字符串处理:
- 获取series的str属性,然后在属性上调用函数
注意:
- str属性只能在字符串列上使用,不能在数字列上使用
- DataFrame上并没有str属性和处理方法
- Series.str并不是Python原生字符串,而是自己的一套方法,不过大部分和原生str很相似
1 获取series的str属性,使用各种字符串处理函数
# 获取str属性
df['col'].str
# 字符串替换,将#替换为空
df['col'].str.replace('#','')
# 判断是不是数字
df['col'].str.isnumeric()
# 字符串长度
df['col'].str.len()
2 使用str的startswith、contains等得到bool的series可以做条件查询
pandas的contains方法类似于python中的in和find
# 获取某一列中数值是意value开头的的bool的series
condition = df['col'].str.startswith(value)
df[condition]
3 需要多次str处理的链式操作
# 将loc列中所有value中的-去掉并对剩下的value进行切片操作
df['loc'].str.replace('-','').str.slice(0,3)
slice(0,3)相当于[0,3]
# 错误示范
df['loc'].str.replace('-','').slice(0,3)
#因为调用replace()后返回的仍然是一个series对象,而只有str对象才能调用slice()
4 使用正则表达式进行处理
**前提:**将year-month-day格式的数据转为year年month月day日
# 添加新列
# ymd列的数据格式为:2021-1-13
def get_new_col(df):
year,month,day = df['ymd'].split('-')
return f"{year}年{month}月{day}日"
df['中文日期'] = df.apply(get_new_col,axis=1)
**问题:**将"2021年1月13日"中的年、月、日三个中文去除掉
方法1:链式replace
df['中文日期'].str.replace('年','').str.replace('月','').str.replace('日','')
方法2:正则表达式
Series.str默认就开启了正则表达式模式
df['中文日期'].str.replace('[年月日]','')
010 axis参数的理解
020 使用stack和pivot实现数据透视
将列式数据变成二维交叉形式,便于分析,叫做重塑或透视
- 1 经过统计得到多维指标数据
- 2 使用unstack实现而据二维透视
- 3 使用pivot简化透视
- 4 stack、unstack、pivot的语法