Pandas入门实践2 -数据处理

news2025/1/19 23:13:32

为了准备数据进行分析,我们需要执行数据处理。在本节中,我们将学习如何清理和重新格式化数据(例如,重命名列和修复数据类型不匹配)、对其进行重构/整形,以及对其进行丰富(例如,离散化列、计算聚合和组合数据源)。

数据清洗

在本节中,我们将介绍如何创建、重命名和删除列;类型转换;和排序-所有这些都使我们的分析更容易。我们将使用NYC Open Data提供的2019年黄色出租车出行数据。

import pandas as pd

taxis = pd.read_csv('../data/2019_Yellow_Taxi_Trip_Data.csv')
taxis.head()

在这里插入图片描述

数据源:NYC Open Data

删除列
让我们从删除ID列和store_and_fwd_flag列开始,我们不会使用这些列。

mask = taxis.columns.str.contains('id$|store_and_fwd_flag', regex=True)
columns_to_drop = taxis.columns[mask]
columns_to_drop

'''
Index(['vendorid', 'ratecodeid', 'store_and_fwd_flag', 'pulocationid',
       'dolocationid'],
      dtype='object')
'''
taxis = taxis.drop(columns=columns_to_drop)
taxis.head()

在这里插入图片描述
提示:另一种方法是选择要保留的列:taxis.loc[:,~mask]

重命名列

taxis = taxis.rename(
    columns={
        'tpep_pickup_datetime': 'pickup', 
        'tpep_dropoff_datetime': 'dropoff'
    }
)
taxis.columns

'''
Index(['pickup', 'dropoff', 'passenger_count', 'trip_distance', 'payment_type',
       'fare_amount', 'extra', 'mta_tax', 'tip_amount', 'tolls_amount',
       'improvement_surcharge', 'total_amount', 'congestion_surcharge'],
      dtype='object')
'''

类型转换
注意到数据类型有什么问题吗?

taxis.dtypes

'''
pickup                    object
dropoff                   object
passenger_count            int64
trip_distance            float64
payment_type               int64
fare_amount              float64
extra                    float64
mta_tax                  float64
tip_amount               float64
tolls_amount             float64
improvement_surcharge    float64
total_amount             float64
congestion_surcharge     float64
dtype: object
'''

pickup 和 dropoff 都应存储为日期时间。让我们解决这个问题:

taxis[['pickup', 'dropoff']] = \
    taxis[['pickup', 'dropoff']].apply(pd.to_datetime)
taxis.dtypes

'''
pickup                   datetime64[ns]
dropoff                  datetime64[ns]
passenger_count                   int64
trip_distance                   float64
payment_type                      int64
fare_amount                     float64
extra                           float64
mta_tax                         float64
tip_amount                      float64
tolls_amount                    float64
improvement_surcharge           float64
total_amount                    float64
congestion_surcharge            float64
dtype: object
'''

提示:还有其他方法可以执行类型转换。对于数值,我们可以使用pd.to_numeric()函数,稍后我们将看到astype()方法,这是一个更通用的方法。

创建新列
让我们为每一行计算以下内容:

  1. 行程时间
  2. 小费百分比
  3. 税金、通行费、规费及附加总额
  4. 出租车的平均速度
taxis = taxis.assign(
    elapsed_time=lambda x: x.dropoff - x.pickup, # 1
    cost_before_tip=lambda x: x.total_amount - x.tip_amount,
    tip_pct=lambda x: x.tip_amount / x.cost_before_tip, # 2
    fees=lambda x: x.cost_before_tip - x.fare_amount, # 3
    avg_speed=lambda x: x.trip_distance.div(
        x.elapsed_time.dt.total_seconds() / 60 / 60
    ) # 4
)

我们的新列将添加到右侧:

taxis.head(2)

在这里插入图片描述
注意事项:
我们使用lambda函数是为了:1)避免重复输入taxis; 2)能够以创建cost_before_tip和elapsed_time列的相同方法访问它们。
要创建一个新列,我们也可以使用df['new_col'] = <values>

按值排序
我们可以使用sort_values()方法根据任意数量的列进行排序:

taxis.sort_values(['passenger_count', 'pickup'], ascending=[False, True]).head()

在这里插入图片描述
要挑选最大/最小的行,请使用nlargest()/nsmallest()。查看3个运行时间最长的行程:

taxis.nlargest(3, 'elapsed_time')

在这里插入图片描述

使用索引

到目前为止,我们还没有真正使用索引,因为它只是一个行号;然而,我们可以改变索引中的值来访问pandas的其他功能。

设置和排序索引
目前,我们有一个RangeIndex,但我们可以通过在调用set_index()时指定一个datetime列来切换到DatetimeIndex:

taxis = taxis.set_index('pickup')
taxis.head(3)

在这里插入图片描述
既然我们有一个完整数据集的样本,让我们按取件时间对索引进行排序:

taxis = taxis.sort_index()

提示:taxis.sort_index(axis=1)将按名称对列进行排序。轴参数在整个pandas中都存在:axis=0目标行,axis=1目标列。

现在我们可以根据日期时间从数据中选择范围,就像我们选择行号一样:

taxis['2019-10-23 07:45':'2019-10-23 08']

在这里插入图片描述
当不指定范围时,我们使用loc[]:

taxis.loc['2019-10-23 08']

在这里插入图片描述
重置索引
我们将在本节后面处理时间序列,但有时我们希望将索引重置为行号并恢复列。我们可以使用reset_index()方法:

taxis = taxis.reset_index()
taxis.head()

在这里插入图片描述

重塑数据

我们正在使用的出租车数据集是一种有利于分析的格式。但情况并非总是如此。现在我们来看一下TSA的旅客吞吐量数据,它将2021年的吞吐量与2020年和2019年的同一天进行了比较:

tsa = pd.read_csv('../data/tsa_passenger_throughput.csv', parse_dates=['Date'])
tsa.head()

在这里插入图片描述
数据源:TSA.gov

首先,我们将列名称小写,并将第一个单词(例如,2021年旅客吞吐量),以使其更易于处理:

tsa = tsa.rename(columns=lambda x: x.lower().split()[0])
tsa.head()

在这里插入图片描述
现在,我们可以重塑它。

Melting(熔化)
Melting(熔化)有助于将数据转换为长格式。现在,我们在一列中显示了所有的旅客吞吐量:

tsa_melted = tsa.melt(
    id_vars='date', # 唯一标识行的列(可以是多个)
    var_name='year', # 通过熔化创建的新列的名称
    value_name='travelers' # 包含来自已经融化列的值的新列的名称
)
tsa_melted.sample(5, random_state=1) # show some random entries

在这里插入图片描述
为了将其转换为旅客吞吐量的时间序列,我们需要将date列中的年份替换为year列中的年份。否则,我们就把往年的数字标错了年份。

tsa_melted = tsa_melted.assign(
    date=lambda x: pd.to_datetime(x.year + x.date.dt.strftime('-%m-%d'))
)
tsa_melted.sample(5, random_state=1)

在这里插入图片描述
这就留下了一些空值(数据集中不存在的日期):

tsa_melted.sort_values('date').tail(3)

在这里插入图片描述
可以使用dropna()方法删除这些内容:

tsa_melted = tsa_melted.dropna()
tsa_melted.sort_values('date').tail(3)

在这里插入图片描述
旋转
使用融合的数据,我们可以透视数据,以比较不同年份特定日期的TSA旅客吞吐量:

tsa_pivoted = tsa_melted\
    .query('date.dt.month == 3 and date.dt.day <= 10')\
    .assign(day_in_march=lambda x: x.date.dt.day)\
    .pivot(index='year', columns='day_in_march', values='travelers')
tsa_pivoted

在这里插入图片描述
重要提示:我们没有介绍unstack()和stack()方法,它们分别是透视和融化的附加方法。
当我们有一个多层次的索引时,这些就派上用场了(例如,如果我们对多列运行set_index())

转置

tsa_pivoted.T

在这里插入图片描述
合并

我们通常会在假期前后观察航空旅行的变化,因此在TSA数据集中添加有关日期的信息可以提供更多上下文。holidays.csv文件包含美国的几个主要节日:

holidays = pd.read_csv('../data/holidays.csv', parse_dates=True, index_col='date')
holidays.loc['2019']

在这里插入图片描述
将假日与TSA旅客吞吐量数据合并将为我们的分析提供更多背景:

tsa_melted_holidays = tsa_melted\
    .merge(holidays, left_on='date', right_index=True, how='left')\
    .sort_values('date')
tsa_melted_holidays.head()

在这里插入图片描述
提示:这个方法有很多参数,所以一定要查阅文档。要追加行,请查看pd.concat()函数。

我们可以更进一步,把每个假期的前后几天标记为假期的一部分。这将更容易比较跨年的假日旅行,并寻找假日前后旅行的任何上升:

tsa_melted_holiday_travel = tsa_melted_holidays.assign(
    holiday=lambda x:
        x.holiday\
            .fillna(method='ffill', limit=1)\
            .fillna(method='bfill', limit=2)
)

提示:查看文档以获得fillna()方法可用功能的完整列表。

请注意,我们现在有了每个假日后一天和前两天的值。2019年的感恩节是11月28日,所以26日、27日、29日都排满了。因为我们只替换空值,所以我们不会用平安夜的前向填充覆盖Christmas Day:

tsa_melted_holiday_travel.query(
    'year == "2019" and '
    '(holiday == "Thanksgiving" or holiday.str.contains("Christmas"))'
)

在这里插入图片描述

聚合和分组

在重塑和清理数据之后,我们可以执行聚合,以各种方式汇总数据。在本节中,我们将探索如何使用透视表、交叉表和分组依据操作来聚合数据。

数据透视表

我们可以构建一个透视表来比较数据集中各年的假日旅行情况:

tsa_melted_holiday_travel.pivot_table(
    index='year', columns='holiday', 
    values='travelers', aggfunc='sum'
)

在这里插入图片描述
我们可以在这个结果上使用pct_change()方法来查看哪些假日旅行时段的旅行变化最大:

tsa_melted_holiday_travel.pivot_table(
    index='year', columns='holiday', 
    values='travelers', aggfunc='sum'
).pct_change()

在这里插入图片描述
让我们创建最后一个包含列和行小计的透视表,沿着对格式进行一些改进。首先,我们为所有浮动设置一个显示选项:

pd.set_option('display.float_format', '{:,.0f}'.format)

接下来,我们将圣诞前夜和圣诞节分组在一起,同样,将新年前夜和元旦分组在一起,并创建透视表:

import numpy as np

tsa_melted_holiday_travel.assign(
    holiday=lambda x: np.where(
        x.holiday.str.contains('Christmas|New Year', regex=True), 
        x.holiday.str.replace('Day|Eve', '', regex=True).str.strip(), 
        x.holiday
    )
).pivot_table(
    index='year', columns='holiday', 
    values='travelers', aggfunc='sum', 
    margins=True, margins_name='Total'
)

在这里插入图片描述
在继续之前,让我们重置显示选项:

pd.reset_option('display.float_format')

时间序列

在处理时间序列数据时,pandas为我们提供了额外的功能,不仅可以比较数据集中的观测结果,还可以利用它们在时间上的关系来分析数据。在本节中,我们将看到一些这样的操作,用于选择日期/时间范围、计算随时间的变化、执行窗口计算以及将数据重新采样到不同的日期/时间间隔。

根据日期和时间选择

taxis = taxis.set_index('dropoff').sort_index()

我们前面看到可以对日期时间进行切片:

taxis['2019-10-24 12':'2019-10-24 13']

在这里插入图片描述
我们也可以用简写来表示这个范围。注意我们必须在这里使用loc[]:

taxis.loc['2019-10-24 12']

在这里插入图片描述
我们可以使用between_time()方法提取任意一天某个特定时间范围内发生的下降:

taxis.between_time('12:00', '13:00')

在这里插入图片描述
提示:at_time()方法可用于提取给定时间的所有条目(e.g., 12:35:27)。

最后,head()和tail()将我们限制在一定数量的行,但是我们可能对数据的前/后2小时(或任何其他时间间隔)内的行感兴趣,在这种情况下,我们应该使用first()/ last():

taxis.first('2H')

在这里插入图片描述
在本节的其余部分,我们将使用TSA旅客吞吐量数据。让我们从设置date列的索引开始:

tsa_melted_holiday_travel = tsa_melted_holiday_travel.set_index('date')

计算随时间的变化

tsa_melted_holiday_travel.loc['2020'].assign(
    one_day_change=lambda x: x.travelers.diff(),
    seven_day_change=lambda x: x.travelers.diff(7),
).head(10)

在这里插入图片描述
提示:要执行减法以外的运算,请查看shift()方法。它还使跨列执行操作成为可能。

重采样

我们可以使用重采样将时间序列数据聚合到一个新的频率:

tsa_melted_holiday_travel['2019':'2021-Q1'].select_dtypes(include='number')\
    .resample('Q').agg(['sum', 'mean', 'std'])

在这里插入图片描述
窗口计算

窗口计算类似于分组依据计算,不同之处在于执行计算的组不是静态的-它可以移动或扩展。Pandas提供用于构造各种窗口的功能,包括移动/滚动窗口,展开窗口(例如,在时间序列中直到当前日期的累积和或平均值),以及指数加权移动窗口(对更近的观测值比更远的观测值更加权)。这里我们只看滚动和展开计算。

执行窗口计算与按计算分组非常相似-我们首先定义窗口,然后指定聚合:

tsa_melted_holiday_travel.loc['2020'].assign(
    **{
        '7D MA': lambda x: x.rolling('7D').travelers.mean(),
        'YTD mean': lambda x: x.expanding().travelers.mean()
      }
).head(10)

在这里插入图片描述
要想了解到底发生了什么,最好把原始数据和结果可视化,下面我们就来先睹为快,用pandas绘图。首先,在notebook中嵌入SVG格式图的一些设置:

import matplotlib_inline
from utils import mpl_svg_config

matplotlib_inline.backend_inline.set_matplotlib_formats(
    'svg', # output images using SVG format
    **mpl_svg_config('section-2') # optional: configure metadata
)

现在,我们调用plot()方法来可视化数据:

_ = tsa_melted_holiday_travel.loc['2020'].assign(
    **{
        '7D MA': lambda x: x.rolling('7D').travelers.mean(),
        'YTD mean': lambda x: x.expanding().travelers.mean()
      }
).plot(title='2020 TSA Traveler Throughput', ylabel='travelers', alpha=0.8)

在这里插入图片描述

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

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

相关文章

rebar3安装-windows篇

rebar3是erlang的包管理工具&#xff0c;虽然不是官方出品&#xff0c;但它已经成为事实上的官方包管理工具了&#xff0c;github地址如下&#xff1a; https://github.com/erlang/rebar3 已经不难看出它的地位了。 rebar官网地址是http://rebar3.org/&#xff0c;上面有安装…

使用Socks5代理加强爬虫的网络安全

网络爬虫是获取互联网上数据的重要手段&#xff0c;但也会因为访问频率过高或其他不当行为&#xff0c;导致被网站封禁或IP被屏蔽。此时&#xff0c;使用代理服务器是解决这一问题的常用方法。本文介绍了Socks5代理的使用方式&#xff0c;以及如何将其应用到爬虫中&#xff0c;…

记录:解决with invalid types() or values()...问题【亲测有效】

&#x1f468;‍&#x1f393;作者&#xff1a;bug菌✏️博客&#xff1a;CSDN、掘金、infoQ、51CTO等&#x1f389;简介&#xff1a;CSDN博客专家&#xff0c;C站历届博客之星Top50&#xff0c;掘金/InfoQ/51CTO等社区优质创作者&#xff0c;全网粉丝合计10w&#xff0c;对一切…

红黑树(C++实现)

文章目录红黑树的概念红黑树的性质红黑树结点的定义红黑树的插入红黑树的查找红黑树的验证检测是否满足二叉搜索树检测是否满足红黑树的性质红黑树与AVL树的比较包含上述功能的红黑树代码红黑树的概念 红黑树,是一棵二叉搜索树,但在每一个结点上增加一个存储位表示结点的颜色,可…

《Netty》从零开始学netty源码(三十五)之DefaultChannelPromise

DefaultChannelPromise 在分析Unsafe或者ChannelPipeline的方法时经常出现Promise类&#xff0c;它用来保存channel的状态值&#xff0c;默认使用的是DefaultChannelPromise&#xff0c;接下来分析这个类。 类结构图 属性值 DefaultChannelPromise中有一个属性result&#xf…

Python之测试框架搭建【一】(毛坯框架)

前言一、框架基础&#xff08;从最小步骤入手_毛坯框架&#xff09; 1&#xff09;首先我们自己建立一个项目&#xff0c;这个项目里面有testcases文件夹&#xff0c;testdatas文件夹2&#xff09;在testdatas里面放测试数据3&#xff09;建立一个main文件4&#xff09;输出测试…

ASP.NET 记录 HttpRequest HttpResponse HttpServerUtility

纯属个人记录,会有错误 HttpRequest Browser是获取客户端浏览器的信息 Cookies是获取客户端的Cookies QueryString是获取客户端提交的数据 ServerVariables是获取服务器端或客户端的环境变量信息 Browser 语法格式: Request.Browser[“浏览器特性名”] 常见的特性名 名称说…

【grafana】使用多级变量解决Granfana模板变量中的大小限制

前言 最近对公司的Kafka 集群集成了 exporter prometheus granfana 服务&#xff0c;我们将 topic 变量抽象成模板变量&#xff0c;此时发现 granfana 变量有 10k 的个数限制。导致我们显示 topic 名称不全。 效果如下&#xff1a;全选后只有 10k 个变量。 解决 一番百度…

【Python】【进阶篇】二十二、Python爬虫的BS4解析库

目录二十二、Python爬虫的BS4解析库22.1 BS4下载安装22.2 BS4解析对象22.3 BS4常用语法1) Tag节点22.4 遍历节点22.5 find_all()与find()1) find_all()2) find()22.6 CSS选择器二十二、Python爬虫的BS4解析库 Beautiful Soup 简称 BS4&#xff08;其中 4 表示版本号&#xff0…

C语言函数大全-- k 开头的函数

C语言函数大全 本篇介绍 C语言函数大全-- k 开头的函数 1. kcalloc 1.1 函数说明 函数声明函数功能void *kcalloc(size_t n, size_t size, gfp_t flags);它是 Linux 内核中的一个函数&#xff0c;用于在内核空间分配一块连续的指定大小的内存&#xff0c;它与标准库函数 ca…

RK3568平台开发系列讲解(设备驱动篇)内核空间与用户空间数据交互实验

🚀返回专栏总目录 文章目录 一、内核空间与用户空间二、用户空间和内核空间数据交换三、实验程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍对内核空间与用户空间的数据交换功能。 一、内核空间与用户空间 Linux 系统将可访问的内存空间分为了两个部…

指针的运算

在C语言中&#xff0c;指针是一个非常重要的概念。指针可以用来访问和修改内存中的数据&#xff0c;也可以用来进行指针的运算。在本篇博客中&#xff0c;我们将探讨指针的解引用、指针与整数的加减运算、同类型指针间的减法运算和指针的关系运算。 指针的解引用 在C语言中&a…

网络安全运维人员面临的痛点分析

1. 工作压力大&#xff1a;网络安全运维人员需要时刻关注系统的安全状况&#xff0c;发现并修复漏洞&#xff0c;保护系统免受攻击和数据泄露的风险。这需要他们不断学习新知识、掌握新技能&#xff0c;并且在短时间内快速响应和处理各种安全问题&#xff0c;这种高强度的工作压…

Arcgis小技巧【12】——ArcGIS标注的各种用法和示例

标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节&#xff0c;内容比较杂&#xff0c;想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】&#xff0c;在【标注】选项卡下勾选【标注此图层中的的…

pr 是什么——可以做什么

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。座右铭&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石&#xff0c;故能成其高。个人主页&#xff1a;小李会科技的…

Boosting算法预测银行客户流失率

Boosting算法预测银行客户流失率 描述 为了防止银行的客户流失&#xff0c;通过数据分析&#xff0c;识别并可视化哪些因素导致了客户流失&#xff0c;并通过建立一个预测模型&#xff0c;识别客户是否会流失&#xff0c;流失的概率有多大。以便银行的客户服务部门更加有针对…

TS+Axios的封装(vue3.x环境)

1. 创建axios实例 # 项目src下新建utils/request.ts # npm i axios 是必须滴 import axios from axiosconst baseURL https://ilovesh.com // 基地址 const instance axios.create({baseURL,timeout: 3000 // 请求超时时间 (3秒超时) })export { baseURL, instance } 2. 添加…

龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席

近日&#xff0c;开放原子开源基金会举办了技术监督委员会&#xff08;以下简称“TOC”&#xff09;第六十九次全体会议&#xff0c;会上针对新一届 TOC 成员改选进行了公正公平的投票&#xff0c;龙蜥社区理事长马涛当选开放原子开源基金会 TOC 副主席。 &#xff08;图左二/龙…

(排序8)归并排序(非递归实现),归并排序的外部排序应用(文件排序)的简单了解

归并排序递归版本 void _MergeSort(int* arr, int left , int right, int* tmp) {if (left > right){return;}int mid (left right) / 2;_MergeSort(arr, left, mid, tmp);_MergeSort(arr, mid 1, right, tmp);int begin1 left;int end1 mid;int begin2 mid 1;int e…

一文掌握 Python、Anaconda、PyCharm 的安装和使用

本文将介绍一个较为全面的 Python 开发环境的搭建与基本使用&#xff0c;包括 Python 解释器的安装使用、PyCharm 编辑器的安装使用、Anaconda 的安装使用和库管理工具 pip 的使用。 PyCharm Anaconda 是一个很完备的 Python 开发环境&#xff0c;也是绝大多数开发者使用的开发…