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.mzph.cn/news/865736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十五、【源码】给代理对象设置属性

源码地址&#xff1a;https://github.com/spring-projects/spring-framework 仓库地址&#xff1a;https://gitcode.net/qq_42665745/spring/-/tree/15-proxy-set-property 给代理对象设置属性 之前的代码是创建Bean进行判断&#xff0c;要不要进行代理&#xff0c;如果代理…

物联网应用Fast ingest

一、原文路径 Tuning the System Global Area 二、翻译 1、原理 Fast ingest 优化是针对高并发&#xff0c;单行数据的插入这种场景的。比如IOT应用采集&#xff08;很符合国网的用采数据场景&#xff09;。 Fast ingest 使用MEMOPTIMIZE_WRITE 提示来插入数据到 MEMOPTIM…

LVM负载均衡群集

一.群集基础概述 1.群集的类型 &#xff08;1&#xff09;负载均衡的群集&#xff1a;以提高应用系统的响应能力&#xff0c;尽可能处理更多的访问请求&#xff0c;减少延迟为目标&#xff0c;获得高并发的、高负载的整体性能。例如&#xff1a;“DNS轮询”&#xff0c;“应用…

.net 快速开发框架开源

DF.OpenAPI开源系统 前后端分离&#xff0c;开箱即用&#xff0c;java经典功能.net也具备 系统介绍 DF.OpenAPI是基于Admin.NET二开的&#xff0c;是一个开源的多租户后台管理系统。采用前后端分离技术&#xff08;前端使用vue.js&#xff0c;后端使用.net 3~.net6&#xff…

SyntaxError: invalid character in identifier 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

鸿翼全链智能知识管理,打造大模型时代的企业知识管理新范式

在知识经济的浪潮中&#xff0c;知识已成为企业构筑竞争优势的基石。随着大模型转向应用落地&#xff0c;其强大的语义理解、推理、逻辑、记忆等能力&#xff0c;推动企业知识管理迈向一个“智能涌现”的新时代。 鸿翼大模型KM知识管理系统&#xff0c;植根于非结构化数据治理全…

Mac安装nvm,node

新的Mac安装nvm&#xff0c;最简单的是先安装nvm&#xff0c;再安装node&#xff0c;官网示例代码也是这么整的&#xff0c;如果已经安装了node&#xff0c;不要慌 多几步终端操作可以“没有如果”。分两种情况&#xff1a;1&#xff0c;还没安装node&#xff0c;直接装nvm&…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。 【来源】…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

【C++】开源:命令行解析库CLI11配置与使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#x…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

新章节:全设备通用调度算法-通讯重构

新章节&#xff1a;全设备通用调度算法-通讯重构 文章目录 新章节&#xff1a;全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了&#xff0c;写代码和更新进度…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的&#xff0c;即客户端发起请求&#xff0c;服务器响应请求&#xff0c;然后连接关闭。但是&#xff0c;WebSocket允许服务器和客户端…

欧盟,又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理?

欧盟&#xff0c;又出了新规-通用充电器新规通用充電器的 RED 修正案如何办理&#xff1f; 欧盟新规委员会发布《通用充电器指令》指南通用充電器的 RED 修正案办理流程&#xff1a; 2024年5月7日&#xff0c;欧盟委员会发布《通用充电器指令》指南&#xff0c;修订了《无线…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期&#xff0c;我们学习了进程创建&#xff0c;进程终止和进程等待&#xff0c;今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

【 香橙派 AIpro评测】大语言模型实战教程:香橙派 AIpro部署LLMS大模型实站(保姆级教学)

引言 OrangePi AIpro 这块板子作为业界首款基于昇腾深度研发的AI开发板&#xff0c;一经发布本博主就火速去关注了&#xff0c;其配备的 8/20TOPS澎湃算力是目前开发板市场中所具备的最大算力&#xff0c;可谓是让我非常眼馋啊&#xff01;这么好的板子那必须拿来用用&#xff…

LeetCode热题100刷题6:160. 相交链表、206. 反转链表、234. 回文链表、141. 环形链表、142. 环形链表 II

160. 相交链表 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件&#xff0c;它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念&#xff0c;dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

nginx转发的问题

我在项目配置的时候遇到一个问题&#xff1a; 配置了域名转发&#xff0c;且配置了https nginx配置如下&#xff1a; server {listen 443 ssl;server_name yourdomain.com;ssl_certificate /path/to/your/certificate.crt;ssl_certificate_key /path/to/your/private.key;loca…

10.SQL注入-http header利用案例

SQL注入-http header利用案例 首先通过登录http头界面,如图所示:登录的信息会被记录到数据库中去&#xff0c;同时使用bp进行抓包分析 将抓包的数据发送repeater里面进行调试 通过useragent进行注入 将useragent对应的数据信息删除掉,输入单引号测试被后台执行报错sql语法…