你应该知道的 3 个不常见的 Pandas 技巧

充分利用 Pandas — 如果您正在阅读本文,那么您一定听说过或使用过 Pandas。因此,我将跳过我谈论 Pandas 有多棒的部分。 😊 在本文中,我们将通过示例演示一些不常用的 Pandas 功能。 …

你应该知道的 3 个不常见的 Pandas 技巧

充分利用 Pandas

如果您正在阅读本文,那么您一定听说过或使用过 Pandas。因此,我将跳过我谈论 Pandas 有多棒的部分。 😊

在本文中,我们将通过示例演示一些不常用的 Pandas 功能。在我 3 年的熊猫之旅中,我并没有经常遇到它们。

学习 Pandas 或任何其他软件工具的最佳方式是练习。这就是我们要做的。第一步是创建一个示例 DataFrame 来处理。

import numpy as np
import pandas as pd
df = 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 中,操作日期的函数在 dt 访问器下可用。 to_period 函数允许将日期转换为特定的时间间隔。我经常使用的时间段是月份和季度。

month 方法只返回在许多情况下没有用处的月份,例如报告历史收入。我们需要能够区分 2020 年 12 月和 2021 年 12 月。这可以通过使用带有 to_period 函数的“M”期来实现。同样,我们可以用“Q”提取季度信息。

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

df["month"] = df["date"].dt.to_period("M")
df["quarter"] = df["date"].dt.to_period("Q")
df.head()

我们还要检查 DataFrame 中不同的年月和季度值。

df["month"].value_counts()# output
2021-12 31
2022-01 31
2022-02 27
2021-11 11
Freq: M, Name: month, dtype: int64
--------------------------
df["quarter"].value_counts()
# output
2022Q1 58
2021Q4 42
Freq: Q-DEC, Name: quarter, dtype: int64

2. Cumsum and groupby

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

df["cumulative_sum"] = df["amount"].cumsum()df.head()

我们现在有金额列中值的累积总和。但是,它没有考虑类。在某些情况下,我们可能需要分别计算不同类别的累积和。

值得庆幸的是,Pandas 使这项任务变得非常简单。我们只需要组行由类柱,然后应用cumsum功能。

df["class_cum_sum"] = df.groupby("class")["amount"].cumsum()

让我们确认 A 类的结果。

df[df["class"]=="A"].head()

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

3. Category data type

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

默认情况下,该列的数据类型为“对象”。

df.dtypes# output
date datetime64[ns]
class object
amount int64
month period[M]
quarter period[Q-DEC]
cumulative_sum int64
class_cum_sum int64

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

让我们复制类列,但使用“类别”数据类型。

df["class_category"] = df["class"].astype("category")df.dtypes# output
date datetime64[ns]
class object
amount int64
month period[M]
quarter period[Q-DEC]
cumulative_sum int64
class_cum_sum int64
class_category category
dtype: object

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

df.memory_usage()# output
Index 128
date 800
class 800
amount 800
month 800
quarter 800
cumulative_sum 800
class_cum_sum 800
class_category 304
dtype: int64

class_category 列消耗的内存不到 class 列的一半。差异是 496 字节,这并不多。但是,当我们使用大型数据集时,差异肯定很重要。

您可以成为 Medium 会员,以解锁对我的作品以及 Medium 其他内容的完全访问权限。如果您已经是,如果您想在我发布新文章时收到电子邮件,请不要忘记订阅。[0][1]

感谢您的阅读。如果您有任何反馈,请告诉我。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2022年5月13日
下一篇 2022年5月13日

相关推荐