前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3 个不常见但非常实用的Pandas 使用技巧

3 个不常见但非常实用的Pandas 使用技巧

作者头像
数据派THU
发布2022-05-27 21:12:49
1.3K0
发布2022-05-27 21:12:49
举报
文章被收录于专栏:数据派THU
代码语言:javascript
复制
来源:DeepHub IMBA本文共1000字,建议阅读5分钟本文为你演示一些不常见,但是却非常有用的 Pandas 函数。

创建一个示例 DataFrame 。

代码语言:javascript
复制
import numpy as npimport pandas as pddf = pd.DataFrame({   "date": pd.date_range(start="2021-11-20", periods=100, freq="D"),  "class": ["A","B","C","D"] * 25,  "amount": np.random.randint(10, 100, size=100)})
df.head()

我们创建有一个 3 列 100 行的 DataFrame。date 列包含 100 个连续日期,class 列包含 4 个以对象数据类型存储的不同值,amount 列包含 10 到 100 之间的随机整数。

1. To_period

在 Pandas 中,操作 to_period 函数允许将日期转换为特定的时间间隔。使用该方法可以获取具有许多不同间隔或周期的日期,例如日、周、月、季度等。

比如针对于时间类型的列,month 方法只返回在许多情况下没有用处的月份的数值,我们无法区分 2020 年 12 月和 2021 年 12 月。但是我们通过使用to_period 函数的参数”M“实现时间序列。

让我们为年月和季度创建新列。

代码语言:javascript
复制
df["month"] = df["date"].dt.to_period("M")df["quarter"] = df["date"].dt.to_period("Q")
df.head()

还可以查看 DataFrame 中不同的年月和季度值。

代码语言:javascript
复制
df["month"].value_counts()# output2021-12   312022-01   312022-02   272021-11   11Freq: M, Name: month, dtype: int64
--------------------------df["quarter"].value_counts()# output2022Q1   582021Q4   42Freq: Q-DEC, Name: quarter, dtype: int64

2. Cumsum 和 groupby

cumsum 是一个非常有用的 Pandas 函数。它计算列中值的累积和。以下是我们通常的使用方式:

代码语言:javascript
复制
df["cumulative_sum"] = df["amount"].cumsum()df.head()

这样就获得了金额列的列值累积总和。但是它只是全部的总和没有考虑分类。在某些情况下,我们可能需要分别计算不同类别的累积和。

Pandas中我们只需要按类列对行进行分组,然后应用 cumsum 函数。

代码语言:javascript
复制
代码语言:javascript
复制
df["class_cum_sum"] = df.groupby("class")["amount"].cumsum()

让我们查看 A 类的结果。

代码语言:javascript
复制
代码语言:javascript
复制
df[df["class"]=="A"].head()
代码语言:javascript
复制

类的累积总和列包含为每个类单独计算的累积值总和。

3. Category数据类型

我们经常需要处理具有有限且固定数量的值的分类数据。例如在我们的 DataFrame 中,”分类“列具有 4 个不同值的分类变量:A、B、C、D。

默认情况下,该列的数据类型为object。

代码语言:javascript
复制
df.dtypes
# outputdate             datetime64[ns]class                     objectamount                     int64month                 period[M]quarter           period[Q-DEC]cumulative_sum             int64class_cum_sum             int64

Pandas 还有一个“Category”数据类型,它比object数据类型消耗更少的内存。因此最好尽可能使用category数据类型。

代码语言:javascript
复制
df["class_category"] = df["class"].astype("category")df.dtypes
# outputdate             datetime64[ns]class                     objectamount                     int64month                 period[M]quarter           period[Q-DEC]cumulative_sum             int64class_cum_sum             int64class_category         categorydtype: object

现在可以比较 class 和 class_category 列的内存消耗。

代码语言:javascript
复制
df.memory_usage()
# outputIndex             128date             800class             800amount           800month             800quarter           800cumulative_sum   800class_cum_sum     800class_category   304dtype: int64

class_category 列消耗的内存不到 class 列的一半。差异是 496 字节,虽然并不多。但是当我们使用大型数据集时,这样差异就会被放大,这样就变成了节省大量的空间。

作者:Soner Yıldırım

编辑:黄继彦

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据派THU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. To_period
  • 2. Cumsum 和 groupby
  • 3. Category数据类型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档