Pandas -----------------------基础知识(六)

news2024/11/28 14:30:59

目录

数据类型

查看类型

类型转换

无法转换的值返回NaN

无法转换的值返回原值

datetime类型

datetime类型数据列作为df索引

Python中的timedelta类型

Pandas中的timedelta类型

pd.to_timedelta函数转换timedelta类型

timedelta类型数据作为df索引

分组groupby

分箱

合并 

append关键字

concat关键字

merge关键字

join关键字

 总结


数据类型

加载数据


import pandas as pd

# 加载数据
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df

查看类型

类型转换

df['PM2.5'] = df['PM2.5'].astype(str)
df.info()

加载数据

df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df2 = df.head().copy()
df2['NO']

df2.loc[::2,'NO'] = 'missing'
df2

类型必须一致 否则不能类型转换
df2['NO'].astype(float)

无法转换的值返回NaN
pd.to_numeric(df2['NO'], errors='coerce') # 强制

无法转换的值返回原值
pd.to_numeric(df2['NO'], errors='ignore') # 忽略

datetime类型

from datetime import datetime
now = datetime.now()
print(now)

dt2 = datetime(2024,10,5,10)
print(dt2)
print(type(dt2))

加载数据

df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df.info() 

转换为时间类型
法一
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv", parse_dates=['Date'])
法二
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df['Date'] = pd.to_datetime(df['Date'])
df.info() 
法三
df = pd.read_csv("/root/pandas_code_ling/data/c_city_day.csv")
df['Date'] = df['Date'].astype(dtype='datetime64[ns]')
df.info()

输出Series对象的年、月、日

print(type(df['Date']))
print(df['Date'].head().dt.year)
print(df['Date'].head().dt.month)
print(df['Date'].head().dt.day)

d = pd.to_datetime('2020-06-20')
print(d.year)
print(d.month)
print(d.day)

print(type(d))

日期计算天数

df['Date'].max() - df['Date'].min()

df['Date'] - df['Date'].min()

计算相差几个月

def fn(dt):
    return (dt - df['Date'].min()).days / 30

df['month_diff'] = df['Date'].apply(fn)
df

datetime类型数据列作为df索引

df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date'], index_col=[1])
df.info()
df.sort_index(inplace=True)

df['2016']

df['2016-12']

日期范围

df['2016-12-1 22':'2016-12-15 23:00:08']

Python中的timedelta类型

from datetime import datetime

t1 = datetime.now()
t2 = datetime(2024, 9, 30)
diff = t1 - t2
# 时间差类型
print(diff)
print(type(diff))

Pandas中的timedelta类型

df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date'])
df['dt_diff'] = df['Date'] - df['Date'].min()
df[['Date', 'dt_diff']]

pd.to_timedelta函数转换timedelta类型

print(df['dt_diff'].dtype)  -- timedelta64[ns]
df['dt_diff'] = df['dt_diff'].astype(str)
print(df['dt_diff'].dtype)
print(df['dt_diff'])

df['dt_diff'] = pd.to_timedelta(df['dt_diff'])
df  -- 类型  timedelta64[ns]

timedelta类型数据作为df索引

df = pd.read_csv('/root/pandas_code_ling/data/c_city_day.csv', parse_dates=['Date'])
df.info()

df2 = df.query('City=="Delhi"')
df2

df2.index = df2['Date'] - df2['Date'].min()
df2

df2['0 days':'4 days']

分组groupby

import pandas as pd
df.groupby分组函数返回分组对象
df = pd.read_csv('/root/pandas_code_ling/data/b_LJdata.csv')
df2 = df.head(20).copy()
df2

gs = df2.groupby(by="区域") # DataFrameGroupBy
print(gs)
# <pandas.core.groupby.generic.DataFrameGroupBy object at 0x7fbfc7c240d0>
gs['价格']
# <pandas.core.groupby.generic.SeriesGroupBy object at 0x7fbfc71b1fd0>

df2.groupby(by=["区域", "户型"])['价格'].mean()

# 不加mean是引用地址  

# <pandas.core.groupby.generic.SeriesGroupBy object at 0x7fbfc71b1c40>

gs2 = df2.groupby(by="户型")
gs2.first()  取第一个

gs2.last()  取最后一个

获取分组后每组的名称
gs2.grouper.result_index

获取3室1厅的租房信息
gs2.get_group(name='3室1厅')

求 根据 户型 分组, 求 面积和价格 的平均值
result = df2.groupby(by='户型')[["面积", "价格"]].mean()
result

求 根据 户型 分组, 求 面积和价格 的平均值和求和
result = df2.groupby(by='户型')[["面积", "价格"]].agg(['mean', 'sum'])
result

按户型分组, 计算 每组价格的平均值+求和 和 看房人数的总数
result = df2.groupby(by='户型').agg({"价格":["mean", "sum"], "看房人数":"sum"})
result

# 按户型分组, 计算每组价格和看房人数的平均值

法一

result = df2.groupby(by = '户型')[['价格','看房人数']].mean()
result

法二

def fn(x):
    s_mean = x.sum() / x.size
    return s_mean

result = df2.groupby(['户型'])[["价格", "看房人数"]].agg(fn)
result

分箱

df3 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df3['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df3

df4 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
# df4['价格高中低'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df4['价格高中低'] = pd.cut(x=df4['价格'], bins=[0,3000,8000,210000])
df4

python

import pandas as pd
import numpy as np

# 创建示例数据
data = np.random.randn(20)
data

# 进行分箱
bins = [-3, -1, 1, 3]
categories = pd.cut(data, bins)

print(categories)
print('------------------------------------')
# 可以指定标签
labels = ['low', 'medium', 'high']
categories_with_labels = pd.cut(data, bins, labels=labels)

print(categories_with_labels)

df2 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=3, labels=['低', '中', '高'])
df2[['价格', '区间']].sort_values(['价格'])

df2[['价格', '区间']].sort_values(['价格'])
df2 = df.head(20).copy()  # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000])
df2[['价格', '区间']].sort_values(['价格'])

df2 = df.head(20).copy() # 复制数据集 
# 分箱返回Seriers对象并复制给新的列
df2['区间'] = pd.cut(x=df2['价格'], bins=[0, 4000, 10000, 200000], labels=['低', '中', '高'])
df2[['价格', '区间']].sort_values(['价格'])

合并 

类似于mysql的多表联查

import pandas as pd

df1 = pd.DataFrame([[1, 2, 3], [1, 10, 20], [5, 6, 7], [3, 9, 0], [8, 0, 3]], columns=['x1', 'x2', 'x3'])
df1

df2 = pd.DataFrame([[1, 2], [1, 10], [1, 3], [4, 6], [3, 9]], columns=['x1', 'x4'])
df2

append关键字

df1.append(df2)   -->  union all
#df1.append(df2, ignore_index=True) 
# 下面的索引从0-9

concat关键字

纵向连接,全部数据都保留
pd.concat([df1, df2])

纵向连接,只保留共有数据
pd.concat([df1, df2], join='inner')

横向连接,全部数据都保留
pd.concat([df1, df2], axis=1)

横向连接,保留索引值匹配的数据
pd.concat([df1, df2], join='inner', axis=1)

merge关键字

pd.merge(df1, df2, how='left', on='x1')

pd.merge(df1, df2, how='right', on='x1')

pd.merge(df1, df2, how='inner', on='x1')

pd.merge(df1, df2, how='outer', on='x1')

join关键字

df1.join(df2, lsuffix='_df1的列名后缀', rsuffix='_df2的列名后缀', how='outer')

 总结

①类型

Pandas数据类型

Python类型

说明

object

str

字符串

int64

int

整数

float64

float

浮点数

bool

bool

布尔值

category

无原生类型

分类类型

datetime

无原生类型

时间日期类型

timedelta

无原生类型

时间差类型

②数据结构中的数据类型

  • object --> python str 字符串 【数据类型】

  • int64 --> python int 整数 【数据类型】

  • float64 --> python float 小数 【数据类型】

  • bool --> python bool True False 【数据类型】

  • datetime64 --> python datetime 时间日期 【数据类型】

  • timedelta[ns]--> 两个时间点之间相距的时间差,单位是纳秒 【数据类型】

③Pandas数据类型转换基本方法

  • df['列名'].astype(str)

  • 当Seriers对象使用astype函数转换的结果中数据类型不同时,使用to_numeric函数

    • pd.to_numeric(df['列名'], errors='coerce')无法转换的值返回NaN

    • pd.to_numeric(df['列名'], errors='ignore') 无法转换的值返回原值

④datetime时间类型

  • datetime时间类型的Seriers来源两种方式:

    • 读取时指定 df = pd.read_csv('..xxx.csv', parse_dates=[1])

    • 转换 df['Date'] = pd.to_datetime(df['Date'])

  • 提取datetime时间类型的Seriers中的具体年月日时分秒星期

    • df['Date'].dt.year

    • df['Date'].dt.quarter # 季度

    • df['Date'].dt.dayofweek + 1 # 星期

  • 提取datetime时间类型的Seriers中的某一个值的具体年月日时分秒星期

    • df4['Date'][0].dayofweek+1 # 星期

  • datetime时间类型的Seriers可以进行时间计算

    • 直接调用聚合函数 df['Date'].max() # 最近的日期

    • 计算时间差 df['Date'] - df['Date'].min() # 返回时间差类型数据构成的Seriers

  • datetime时间类型的S对象作为索引的两种方式

    • df = pd.read_csv('..xxx.csv', index_col='Date', parse_dates=True)

    • df.index = df['date']

    • 注意:要对索引进行重新排序 必要步骤 df = df.sort_index()

  • datetime时间类型索引可以按照时间范围取子集

    • df['2018']

    • df['2016-06']

    • df.loc['2015-3-4 22': '2016-1-1 23:45:00']

⑤timedelta时间差类型

  • timedelta时间差类型的创建:

    • df['date_diff'] = df['Date'] - df['Date'].min()

  • 字符串类型转换为时间差类型

    • s2 = pd.to_timedelta(s1)

  • timedelta时间差类型设为索引

    • df.index = df['Date'] - df['Date'].min()

  • 基于时间差范围来选择数据

    • df['0 days':'4 days']

⑥分组对象

  • gs = df.groupby(['列1', '列2']) 按照列1、列2的值对数据集进行分组,返回分组对象

  • gs.first() 返回每组的第一条数据

  • gs.last() 返回每组的最后一条数据

  • gs.grouper.result_index 获取全部组名

  • gs.get_group((组名)) 按照

  • 分组后对多列分别使用不同的聚合函数

  • df.groupby(['列名1', '列名2']).agg({
        '指定列1':'mean', 
        '指定列2':'sum', 
        '指定列3':'mean'
    })

⑦数据离散化(分箱)用来把一组数据分割成若干个离散的区间。比如有一组年龄数据,可以使用pandas.cut将年龄数据分割成不同的年龄段并打上标签。上述过程又叫做分箱。

  • 参数x 指定离散化(分箱)依据的列,Seriers对象
  • 参数bins 分为几组,int类型,也可以传入分组区间的列表
  • 参数labels 每组的标签名称,按数值由小到大的顺序
  • 参数right 默认True:左开右闭;False:左闭右开
  • 参数include_lowest 默认False:不包含第一个分组的起始值;True:包含

⑧合并df的四个函数总结

  • df1.append(df2) 纵向合并数据集

  • pd.concat([df1,df2]) 横向或纵向合并数据集,df1和df2可以没有任何关系

  • df1.merge(df2) 横向合并, df1和df2要有关联的列, 类似SQL中的表关联操作

  • df1.join(df2) 横向合并,df1和df2要有相同的索引值才能关联

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

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

相关文章

开发环境简单介绍

目录 开发环境keil的安装和使用 keil的介绍 keil的安装 keil的简单使用 STC-ISP的安装 STC-ISP简单介绍 开发环境测试 总结 开发环境keil的安装和使用 keil的介绍 Keil uVision5是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于对嵌入式系统中的微控制器…

vue-scrollto实现页面组件锚点定位

文章目录 前言背景操作指南安装及配置步骤vue组件中使用 参考文章 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1a;Java后端、大数据…

Java | Leetcode Java题解之第454题四数相加II

题目&#xff1a; 题解&#xff1a; class Solution {public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {Map<Integer, Integer> countAB new HashMap<Integer, Integer>();for (int u : A) {for (int v : B) {countAB.put(u v, countAB.getOrDefa…

多模态—文字生成图片

DALL-E是一个用于文字生成图片的模型&#xff0c;这也是一个很好思路的模型。该模型的训练分为两个阶段&#xff1a; 第一阶段&#xff1a;图片经过编码器编码为图片向量&#xff0c;当然我们应该注意这个过程存在无损压缩&#xff08;图片假设200*200&#xff0c;如果用one-h…

VBA中类的解读及应用第十六讲:让文本框在激活时改变颜色(中)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

数据链路层(以太网简介)

一.以太网数据帧结构&#xff1a; 目的地址&#xff0c;源地址&#xff0c;类型这三个被称为帧头&#xff0c;数据则被称为载荷&#xff0c;CRC则被称为帧尾&#xff08;校验和&#xff09; 二.数据帧结构分析 1.目的地址和源地址 i.地址解释 这两个地址指的是mac地址&#x…

【AIGC】2022-NIPS-视频扩散模型

2022-NIPS-Video Diffusion Models 视频扩散模型摘要1. 引言2. 背景3. 视频扩散模型3.1. 重建引导采样以改进条件生成 4. 实验4.1. 无条件视频建模4.2. 视频预测4.3. 文本条件视频生成4.3.1 视频与图像建模的联合训练4.3.2 无分类器指导的效果4.3.3 更长序列的自回归视频扩展 5…

数通 2

一 网络层 数据传输中最大支持1518字节&#xff0c;所以超过这个一次传不过去&#xff0c;就要分开传&#xff0c;就像快递标记1/2, 2/2 。说明你有两包 下图例子解释了 identification 用于标识一台设备发送的数据 片偏移&#xff0c;就是 你 好 吗 三个分片谁先到达不一定&…

C语言 | Leetcode C语言题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; int next(int* nums, int numsSize, int cur) {return ((cur nums[cur]) % numsSize numsSize) % numsSize; // 保证返回值在 [0,n) 中 }bool circularArrayLoop(int* nums, int numsSize) {for (int i 0; i < numsSize; i) {if (!n…

vue-live2d看板娘集成方案设计使用教程

文章目录 前言v1.1.x版本&#xff1a;vue集成看板娘&#xff08;暂不使用&#xff0c;在v1.2.x已替换&#xff09;集成看板娘实现看板娘拖拽效果方案资源备份存储 当前最新调研&#xff1a;2024.10.2开源方案1&#xff1a;OhMyLive2D&#xff08;推荐&#xff09;开源方案2&…

小米 MIX FOLD工程固件 更换字库修复分区 资源预览与刷写说明

小米 MIX FOLD机型代号 :cetus 该手机搭载骁龙888旗舰处理器 。对于一些因为字库问题损坏导致的故障,更换字库后要先刷写对应的工程底层修复固件。绑定cpu后在写入miui量产固件。 通过博文了解 1💝💝💝-----此机型工程固件的资源刷写注意事项 2💝💝💝-----此…

合肥企业参访:走进联想合肥智能制造基地参观学习

跟随华研标杆游学高丽华高老师去到联想参观游学 联想合肥智能制造基地成立于2011年&#xff0c;是联想集团全球蕞大的PC研发和制造基地&#xff0c;也是智能制造示范基地。基地占地约500亩&#xff0c;拥有全球PC制造业蕞大的单体厂房以及业界主板、整机生产线。在这里&#xf…

fiddler抓包17_简单接口测试(Composer请求编辑)

课程大纲 ① 进入“Composer”&#xff08;请求编辑&#xff09;界面&#xff1a; Fiddler右侧标签菜单选择“Composer”&#xff0c;中文“请求编辑” 。 ② 编辑、发送请求&#xff1a; 填写接口请求信息&#xff08;或从左侧列表直接拖拽填充&#xff09;&#xff0c;点击“…

力扣 简单 100.相同的树

文章目录 题目介绍解法 题目介绍 解法 采用递归的思想 class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(p null || q null){return p q; // 必须都是 null才返回true}return p.val q.val && isSameTree(p.left, q.left) && isSa…

【Qt】控件概述(3)—— 显示类控件

显示类控件 1. QLabel——标签1.1 setPixmap设置图片1.2 setAlignment设置文本对齐方式1.3 setWordWrap设置自动换行1.4 setIndent设置缩进1.5 setMargin设置边距1.6 body 2. QLCDNumber2.1 使用QTimer实现一个倒计时效果2.2 使用循环的方式实现倒计时 3. QProgressBar——进度…

Linux安装AnythingLLM

1. AnythingLLM 简介 AnythingLLM 是 Mintplex Labs 开发的一款可以与任何内容聊天的私人ChatGPT&#xff0c;是高效、可定制、开源的企业级文档聊天机器人解决方案。它能够将任何文档、资源或内容片段转化为大语言模型&#xff08;LLM&#xff09;在聊天中可以利用的相…

【Android】设备操作

本文介绍App开发常用的一些设备操作&#xff0c;主要包括如何使用摄像头进行拍照、如何使用麦克风进行录音并结合摄像头进行录像、如何播放录制好的音频和视频、如何使用常见传感器实现业务功能、如何使用定位功能获取位置信息、如何利用短距离通信技术实现物联网等。 摄像头 …

Armeria gPRC 高级特性 - 装饰器、无框架请求、阻塞处理器、Nacos集成、负载均衡、rpc异常处理、文档服务......

文章目录 定义一个示例高级特性装饰器概述简单案例多种装饰方式 无框架请求概述使用方式 阻塞任务处理器背景概述多种使用方式 rpc 异常统一处理使用方式更详细的异常信息 Armeria 提供 gRPC 客户端多种调用方式同步调用异步调用使用装饰器 负载均衡简单案例Armeria 提供的所有…

5G NR相关笔记

为了提供一致且准确的时序定义&#xff0c;NR规范了一个 基本时间单位 T c 1 / ( 480000 4096 ) , T_c1/(480 000\times 4096), Tc​1/(4800004096),所有与5GNR相关的时间的定义都被描述为这个基本时间单位的整数倍。基本时间单位 T c T_c Tc​ 因此可以看成是子载波间隔480…

10.2 Linux_进程_进程相关函数

创建子进程 函数声明如下&#xff1a; pid_t fork(void); 返回值&#xff1a;失败返回-1&#xff0c;成功返回两次&#xff0c;子进程获得0(系统分配)&#xff0c;父进程获得子进程的pid 注意&#xff1a;fork创建子进程&#xff0c;实际上就是将父进程复制一遍作为子进程&…