Pandas函数详解:案例解析(第25天)

系列文章目录


  1. Pandas函数详解
  2. 排序函数
  3. 聚合函数
  4. 缺失值处理
  5. 日期函数

文章目录

  • 系列文章目录
  • 前言
    • 1 索引和列名操作
      • 1.1 查看索引和列名
      • 1.2 修改索引和列名
    • 2 常用计算函数
      • 2.1 排序函数
      • 2.2 聚合函数
      • 2.3 练习
    • 3 缺失值处理
      • 3.1 缺失值概念
      • 3.2 加载包含缺失值数据
      • 3.3 查看缺失值
      • 3.4 缺失值处理
        • 3.4.1 删除缺失值
        • 3.4.2 填充缺失值
    • 4 pandas数据类型
      • 4.1 类型转换
      • 4.2 category类型
      • 4.3 日期时间类型
      • 4.4 时间差类型


前言

本文主要通过案例解析的方式详解了Pandas工作中常用函数。


提示:以下是本篇文章正文内容,下面案例可供参考

1 索引和列名操作

1.1 查看索引和列名

# 导入模块
import pandas as pd
# 加载数据集
df = pd.read_csv('data/LJdata.csv')
# 获取区域列为天通苑租房的信息
df2 = df[df['区域']=='天通苑租房']
df2
# 获取df2中价格列
df2_price = df2['价格']
df2_price
# 获取行索引值
# s/df.index
df2_price.index
type(df2_price.index)
df2.index
# 获取行索引值列表中的具体值  通过下标取值
df2.index[0]
# 获取s对象的行索引值
df2_price.keys()
# 获取df的列名
df2.keys()
df2.columns
# 通过列表下标值获取数据值
df2.columns[-1]

1.2 修改索引和列名

  • set_index()方法

    # 通过set_index(keys=[列名])方法设置索引值
    df2.set_index(keys=['区域'])
    # 多列索引为复合索引 -> 了解  
    df2.set_index(keys=['区域','地址'])
    # 读取数据是通过参数指定索引列
    # index_col
    
  • index_col属性

    # 读取数据时通过index_col参数指定索引
    df4 =pd.read_csv('data/LJdata.csv', index_col=['区域'])
    df4
    pd.read_csv('data/LJdata.csv', index_col=['区域', '地址'])
    
  • reset_index()方法

    # 重置行索引 
    # reset_index(drop=)  
    # drop: 是否删除原行索引, 默认不删除(原索引作为df中的一列)
    df4.reset_index()
    # 删除原索引
    df4.reset_index(drop=True)
    # s对象重置索引 返回df对象
    df2_price.reset_index()
    # s对象重置索引 返回s对象
    df2_price.reset_index(drop=True)
    
  • 赋值修改

    必须要获取所有索引和列名, 修改的列表中的数据要和行数/列数相同

    df5 = df2_price.reset_index().head()
    df5
    # 先获取索引和列名
    df5.index
    df5.columns
    # 如何修改列表中的数据  赋值修改
    list1 = [1,2,3,4]
    list1[0]='a'
    list1
    # 赋值修改索引  df索引值数和列表的数据个数相等
    df5.index = [0, 'b', 'c', 'd', 'e']
    df5
    # 赋值修改列名
    df5.columns = ['列名1', '列名2']
    df5
    
  • rename()方法修改

    灵活修改, 可以修改指定的索引或列名

    # df.rename(index={原索引:新索引,...}, columns={原列名:新列名,...}, inplace=)
    # 修改行索引
    df5.rename(index={'b': 1, 'e': 'E'})
    # 修改列名
    df5.rename(columns={'列名1':'id', '列名2':'price'})
    # 同时修改索引和列名
    df5.rename(index={'b':1,'c':2,'d':3,'e':4},columns={'列名1':'id','列名2':'price'},inplace=True)
    df5
    

2 常用计算函数

2.1 排序函数

  • nlargest()

    # 导入模块
    import pandas as pd
    # 加载数据集
    df = pd.read_csv('data/LJdata.csv')
    df2 = df.head(10)
    df2
    # df.nlargest(n, columns=[列名1, 列名2,...])
    # 根据指定的列进行降序操作, 获取前n个数据
    # 获取看房人数列排名前5数据 -> 看房人数值相同时, 再通过价格值比较
    df2.nlargest(n=5, columns=['看房人数', '价格'])
    df2.nlargest(3, '价格')
    
  • nsmallest()

    # df.nsmallest(n=, columns=[列名1, 列名2, ...])
    # 根据指定的列值进行升序操作, 获取前n个数据
    # 获取面积最小的前3条数据
    df2.nsmallest(n=3, columns=['面积'])
    
  • sort_values()

    # df.sort_values(by=[列名1, 列名2, ...], ascending=[True, False, ...])
    # ascending: 排序方式, 默认True 升序, False 降序
    # 对一列数据进行排序 默认升序  order by 面积 asc
    df2.sort_values(by=['面积'])
    # 降序 order by 面积 desc
    df2.sort_values(by=['面积'], ascending=False)
    # 对多列进行排序操作 
    # 第一列中数据值相等时, 以第二列进行排序, ...  order by 看房人数,价格 asc
    df2.sort_values(by=['看房人数','价格'], ascending=True)
    df2.sort_values(by=['看房人数','价格'], ascending=False)
    # 对多列对应不同排序方式的排序操作 order by 看房人数 asc, 价格 desc
    df2.sort_values(by=['看房人数', '价格'], ascending=[True, False])
    
  • sort_index()

    # 对索引进行排序操作
    df2.sort_index(ascending=False)
    

2.2 聚合函数

# 聚合函数一般是和分组结合使用
# 聚合函数单独使用, 是对一列数据进行聚合, 返回一个结果值
# min 最小值, 默认是按列计算 axis=0
df2.min()
# 按行计算 axis=1
df2.min(axis=1)
df2['价格'].min()
# max 最大值
df2.max()
# mean 平均值
df2.mean()
# std 标准差  机器学习
df2.std()
# median 中位数
df2.median()
# sum 求和
# 数值列求和, 非数值列字符串拼接
df2.sum()
# cumsum 累计求和  1 1+2  1+2+3
df2.cumsum()
# count 统计非空值个数
df2.count()
# 统计每行个数
df2.count(axis=1)
# value_counts() 统计不同值出现的次数 分组计算
df2['朝向'].value_counts()
# corr 相关性计算 了解  给机器学习处理数据时, 获取相关性不是很强的列作为特征列进行模型训练
# 计算数值列之间的相关性 -1~1 负数就是负相关, 正数就是正相关
df2.corr()
# quantile 分位数 默认二分位 -> 中位数
# 二八原则 获取1/5分位值, 根据分位值获取20%数据
df2.quantile() 
# 通过q参数自定义分位
df2.quantile(q=[0, 0.25, 0.5, 0.75, 1])
df2['价格'].quantile(q=[0,1/3, 2/3, 1])
# 根据价格获取前75%的数据
df2[df2['价格']<7725] 

2.3 练习

# 找到租金最低和最高的房子的全部信息
# 找到最近新上的10套房源
# 每套房子的平均租房价格-元/平米  所有房子平均价格
# 统计不同户型的房源数量

3 缺失值处理

3.1 缺失值概念

数据中都会存在缺失值

pandas中的缺失值用numpy中的NaN,NAN,nan值表示

sql中的缺失值用NULL,null表示

python中的缺失值用None表示

也可以用一些特定的值表示缺失值 missing,0,空字符串

缺失值是不参与统计计算的

from numpy import NAN, NaN, nan
# 缺失值不等于0,'',bool值
print(NAN == 0)
print(nan == '')
print(nan == True)
print(nan == False)
# 缺失值之间也是不相等
print(NAN==NAN)
print(NAN==NaN)
# 缺失值如何产生的?
# 数据采集过程中, 是没有采集到数据
# 计算过程中, 产生缺失值 -> sql关联, 关联不上的用缺失值填充

3.2 加载包含缺失值数据

import pandas as pd
# 加载城市天气数据集
df = pd.read_csv('data/city_day.csv')
df
# 缺失值不参与统计
df.count()
# 加载数据集时, 不转换空值
# keep_default_na:默认True, 将空值用NaN值表示
new_df = pd.read_csv('data/city_day.csv', keep_default_na=False)
new_df
new_df.count()
# 指定数据值用NaN值替换
# missing、空字符串、0等值可以表示的是NaN值
# city列用Ahmedabad表示的是NaN值
# na_values:指定某些数据值在加载时用NaN替换
pd.read_csv('data/city_day.csv', keep_default_na=False, na_values=['Ahmedabad', '2015-01-01'])
# 可以通过replace函数实现替换
df.replace(to_replace='Ahmedabad', value=NaN)

3.3 查看缺失值

# 通过info方法进行查看
df.info()
# isnull/isna判断数值是否是缺失值 返回True False
# notnull/notna判断数值是否不是缺失值 返回True False
df.head().isnull()
df.isna()
# 如果值不是缺失值, 返回True
df['PM2.5'].head().notnull()
df.head().notna()
# 统计每列缺失值数量
# 布尔值进行数值计算时,True转换成1,False转换成0
df.isnull().sum()
# 统计每行缺失值数量
df.isna().sum(axis=1)
# 统计每列非缺失值数量
df.count()
# 通过missingno模块 可视化展示缺失值 -> 了解
# 在jupyter中安装模块, 前边加一个 !
!pip install missingno -i https://pypi.tuna.tsinghua.edu.cn/simple/
import missingno as msno
import matplotlib.pyplot as plt
# 绘制缺失值柱状图
msno.bar(df)
plt.show()
# 绘制缺失值位置图形
msno.matrix(df)
# 随机获取100条数据
df.sample(100)
msno.matrix(df.sample(100))
# 绘制缺失值相关性图形
msno.heatmap(df)

3.4 缺失值处理

3.4.1 删除缺失值
# 一般情况下不建议删除行或列, 除非是缺失值占比很高 80%以上 
# 删除行列 drop()
# df.dropna()
# 随机获取10条数据
# random_state:随机数种子, 了解
df2 = df.sample(n=10, random_state=5)
df2
# 按行删除包含缺失值的行数据
df2.dropna(how='any')
# 统计每行缺失值的数量
df2.isnull().sum(axis=1)
# 删除每行的数据都为缺失值的行数据
df2.dropna(how='all')
# 按列删除缺失值的列
df2.dropna(axis=1)
# 统计每列中缺失值的数量
df2.isnull().sum()
# 删除指定列中包含缺失值的行数据
# subset
df2.dropna(subset=['PM10', 'NH3'])
# 删除缺失值行数据之后, 非空值个数大于等于指定的阈值时, 会保留当前行
df2.dropna(thresh=12)
df.isnull().sum()
# 通过drop方法删除缺失值占比很高的列
df.drop(labels=['Xylene'],axis=1)
3.4.2 填充缺失值
  • 固定值填充

    # df.fillna(value=)
    # 使用常数值或统计值填充缺失值
    df2 = df.copy()
    df2
    # 用常数填充
    # 例如: 性别列 男,女  缺失值可以用未知进行填充(问业务方)
    df2['PM2.5'].fillna(value='未知')
    df2.fillna(value='未知')
    df2['PM2.5'].mean()
    # 使用统计值填充缺失值 平均值,最大最小值,众数
    df2['PM2.5'] = df2['PM2.5'].fillna(value=df2['PM2.5'].mean())
    df2
    
  • 前后值填充

    # 使用缺失值的前后非缺失值填充 -> 对时间序列数据
    temp_s = df['Xylene'][54:64]
    temp_s
    # 使用缺失值的上一个非缺失值填充
    # method: ffill:前一个非缺失值  bfill:后一个非缺失值
    temp_s.fillna(method='ffill')
    temp_s.fillna(method='bfill')
    
  • 线性填充

    # 线性填充法
    # 认为值之间存在一个线性关系, 自动用线性值填充
    temp_s.interpolate()
    

4 pandas数据类型

4.1 类型转换

import pandas as pd
df = pd.read_csv('data/city_day.csv')
df.info()
# 类似于sql中的cast操作
# s.astype(内置类型名)
# 查看列类型
df['PM2.5'].dtype
# 转换成字符串类型
df['PM2.5'] = df['PM2.5'].astype('str')
df.info()
# 转换成浮点类型
df['PM2.5'].astype('float')
# 构造包含 missing字符的数据
df2 = df.head().copy()
df2
# 将1,3,5行的NO列值替换成missing
df2.loc[::2, 'NO'] = 'missing'
df2
# 发生报错, missing不能转换成float类型
df2['NO'].astype('float')
# pd.to_numeric()
# raise: 如果不能转换会抛出异常
pd.to_numeric(df2['NO'], errors='raise')
# coerce: 强制转换, 非浮点值用NaN值替换
pd.to_numeric(df2['NO'], errors='coerce')
# ignore: 不发生转换,也不发生报错
pd.to_numeric(df2['NO'], errors='ignore')

4.2 category类型

# 创建category类型
# data接受的是一个分类对象 pd.Categorical(values=, categorires=)
s1 = pd.Series(data=pd.Categorical(values=['a', 'b', 'c', 'd'], categories=['a', 'b', 'c']))
s1
s2 = pd.Series(data=['a', 'b', 'c', 'd', 'a', 'b'],dtype='category')
s2
# 转换df中列的类型为category类型
df.info()
df['City'] = df['City'].astype('category')
df.info()

4.3 日期时间类型

  • python日期时间

    # python中通过datetime/time模块获取日期时间
    import datetime
    t1 = datetime.datetime.now()
    t1
    type(t1)
    someday = datetime.datetime(2024,2,24)
    someday
    import time
    time.time()
    from datetime import datetime
    # format -> 将日期时间类型转换成字符串日期
    a = datetime.strftime(t1, '%Y-%m-%d')  
    print(a)
    type(a)
    datetime.strptime(a, '%Y-%m-%d')  # parse -> 将字符串日期转换成日期时间类型
    
  • 日期类型转换

    # 读取数据时将列解析成日期时间类型
    # parse_dates: 指定列名或列下标
    new_df = pd.read_csv('data/city_day.csv', parse_dates=['Date'])
    new_df.info()
    # 通过pd.to_datetime(列名)方法转换成日期时间类型
    df = pd.read_csv('data/city_day.csv')
    df['Date'] = pd.to_datetime(df['Date'])
    df.info()
    
    df = pd.read_csv('data/city_day.csv')
    df.info()
    # 通过astype方法转换成日期时间类型
    df['Date'].astype('datetime64[ns]')
    
  • 提取日期时间列中部分数据

    # 提取日期时间类型中部分数据
    # .dt -> 获取一列中的部分数据
    new_df['year'] = new_df['Date'].dt.year
    new_df
    new_df['Date'].dt.month
    
    t2 = datetime(2024,2,24)
    t2
    # 获取一个值中的部分数据
    t2.year
    t2.month
    t2.day
    
  • 日期时间运算

    # 获取Date列中最小日期
    new_df['Date'].min()
    # 日期时间作差, 得到天数差值 timedelta64[ns] 时间差类型
    new_df['Date'] - new_df['Date'].min()
    
  • 日期时间索引

    # 设置日期时间列为索引
    df = pd.read_csv('data/city_day.csv',index_col=['Date'], parse_dates=True)
    df.index
    # 使用日期时间获取部分数据之前,需要对索引列进行排序
    df = df.sort_index()
    # 获取2018年的数据
    df['2018']
    # 获取2018-08的数据
    df['2018-08']
    # 获取时间范围内的数据
    df.loc['2018-08-01 22':'2019-01-01 23:11:12']
    

4.4 时间差类型

  • python中timedelta类型

    from datetime import datetime
    now = datetime.now()
    print(now)
    t1 = datetime(2024,2,22)
    print(t1)
    diff = now-t1
    print(diff)
    print(type(diff))
    
  • 时间差类型转换

    df = pd.read_csv('./data/city_day.csv', parse_dates=[1])
    df.info()
    # 日期时间作差得到时间差类型
    ref_date = df['Date'] - df['Date'].min()
    ref_date
    # 转换成时间差类型
    s1 = ref_date.astype('object')
    s1
    pd.to_timedelta(s1)
    s1.astype('timedelta64[ns]')
    
  • 时间差索引

    # 时间差类型设置成索引
    df = pd.read_csv('./data/city_day.csv', parse_dates=[1])
    # 将时间差列设置为索引
    df.index = df['Date'] - df['Date'].min()
    df = df.sort_index()
    # 需要先对索引排序, 然后根据范围获取部分数据
    df['0 days':'4 days']
    

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/769461.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小型语言模型SLM:趋势和用例

前言 近年来&#xff0c;GPT 和 BERT 等大型语言模型 (LLM) 不断发展&#xff0c;参数数量从数亿飙升至 GPT-4 等后继者的一万亿以上。然而&#xff0c;不断增长的参数规模引出了一个问题&#xff1a;对于企业应用来说&#xff0c;参数规模越大就一定越好吗&#xff1f; 答案…

ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程

ode45自己编的程序和测试代码 模型 模拟一个卫星绕大行星飞行的轨迹计算。 结果 轨迹图如下: 源代码 以下代码复制到MATLAB上即可运行,并得到上面的图像: % ode45自己编的程序和测试代码 % Evand©2024 % 2024-7-2/Ver1 clear;clc;close all; rng(0); % 参数设定…

微信小程序订单发货管理接入

订单发货管理接入指引&#xff1a;https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetannouncement&key11671435333v04b2&version1&langzh_CN&platform2https://mp.weixin.qq.com/cgi-bin/announce?token1148555877&actiongetann…

上海小程序开发需要进行定制开发吗?

随着互联网技术与移动设备的不断成熟&#xff0c;小程序也已普及到人们日常生活的方方面面。随着企业与互联网联结的愈发深入&#xff0c;小程序的开发可以为企业带来更高效的经营模式&#xff0c;降本增效。那么&#xff0c;上海小程序作为无需安装且开发门槛较低的应用&#…

VulnHub靶场之DarkHole_1

1 信息收集 1.1 主机发现 arp-scan -l 主机IP地址为&#xff1a;192.168.1.17 1.2 端口和服务扫描 nmap -sS -sV -A -T5 -p- 192.168.1.17 开放22&#xff0c;80端口 1.3 目录扫描 dirsearch -u 192.168.1.17 2 渗透 2.1 访问端口 2.2 注册账号 暴力破解不现实&#…

网口串口(Serialport)服务器

文章所用工具http://t.csdnimg.cn/2gIR8http://t.csdnimg.cn/2gIR8 搭建服务器界面 操作配置文件保存方式类 public string FileName { get; set; }public IniHelper(string name) {this.FileName name; //在构造函数中给路径赋值} 1 先导入c语言进行读取操作ini文件的方法 …

理解Netty的核心概念

一、理解Netty Netty是一个用于开发高性能网络应用的框架。为了更容易理解它&#xff0c;下面一些描述&#xff0c;不一定准确&#xff0c;但一定容易理解。 从Netty的Channel开始&#xff0c;把Netty所有的核心概念都串起来。 Channel 简单理解为一个连接。 有一个特殊的C…

python使用pywebview集成vue3和element-plus开发桌面系统框架

随着web技术越来越成熟&#xff0c;就连QQ的windows客户端都用web技术来开发&#xff0c;所以在未来&#xff0c;web技术来开发windows桌面软件也会越来越多&#xff0c;所以在此发展驱动之下&#xff0c;将最近流程的python与web技术相结合&#xff0c;使用vue3和element-plus…

使用requests爬取拉勾网python职位数据

爬虫目的 本文是想通过爬取拉勾网Python相关岗位数据&#xff0c;简单梳理Requests和xpath的使用方法。 代码部分并没有做封装&#xff0c;数据请求也比较简单&#xff0c;所以该项目只是为了熟悉requests爬虫的基本原理&#xff0c;无法用于稳定的爬虫项目。 爬虫工具 这次…

Linux中为什么etc是存放配置文件

在计算机系统中&#xff0c;/etc 是一个目录的名称&#xff0c;通常位于Unix和类Unix操作系统中&#xff0c;如Linux。这个目录用于存放系统配置文件。/etc 的命名来源于早期Unix系统中的 "etcetera"&#xff08;拉丁语 "et cetera" 的缩写&#xff0c;意为…

电子工程与网络技术解析

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 正文 1、MUX&PD是什么意思 2、Hub 和HUB有什么区别 3、Redriver什么意思 4、Switch是什么意思 5、USB 2.0 ETHERNET2什么意思 6、…

[译]全栈Redux实战

本文乱译自一篇英文博文&#xff08;Full-Stack Redux Tutorial&#xff09;&#xff0c;本人英语能力不足&#xff0c;技术能力有限&#xff0c;如有错误&#xff0c;多多包涵。 #关于ReduxReactImmutable的测试先行开发综合指南 Redux是最近发生在js界令人兴奋的事儿。它把…

Vue+Xterm.js+WebSocket+JSch实现Web Shell终端

一、需求 在系统中使用Web Shell连接集群的登录节点 二、实现 前端使用Vue&#xff0c;WebSocket实现前后端通信&#xff0c;后端使用JSch ssh通讯包。 1. 前端核心代码 <template><div class"shell-container"><div id"shell"/>&l…

Unity动画系统(2)

6.1 动画系统基础2-3_哔哩哔哩_bilibili p316 模型添加Animator组件 动画控制器 AnimatorController AnimatorController 可以通过代码控制动画速度 建立动画间的联系 bool值的设定 trigger p318 trigger点击的时候触发&#xff0c;如喊叫&#xff0c;开枪及换子弹等&#x…

css flex 子元素溢出时,父元素被撑开解决方案

当父元素使用flex: 1;自适应填满时&#xff0c;子元素内容溢出&#xff0c;父元素内容撑大&#xff0c;导致页面显示问题&#xff0c;或设置了overflow 为scroll 的元素没出现滚动条等问题 解决方案&#xff1a; 1.如果是横向排列&#xff0c;flex: 1;的元素加上width: 0; 此…

【PB案例学习笔记】-28制作一个右键菜单

写在前面 这是PB案例学习笔记系列文章的第28篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

流量控制组件选型之 Sentinel vs Hystrix

Sentinel: Sentinel 是阿里中间件团队研发的面向分布式服务架构的轻量级高可用流量控制组件&#xff0c;于2018年7月正式开源。Sentinel 主要以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来帮助用户提升服务的稳定性。大家可能会问&#xff1a;Sen…

总线局域网及解决冲突的方案

上文内容&#xff1a;局域网 1.什么是总线局域网 总线网结构&#xff1a; 所有的结点通过专门的网卡附接到一条总线上&#xff1b; 所有结点的信息都发送到同一条总线上&#xff08;冲突&#xff09;&#xff1b; 所有结点都从同一媒体上收取信息&#xff08;广播&am…

视频汇聚/安防监控/GB28181国标EasyCVR视频综合管理平台出现串流的原因排查及解决

安防视频监控系统/视频汇聚EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;视频汇聚EasyCVR平台支持设备…