Pandas笔记总结

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的语法
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值