你应该知道的 3 个不常见的 Pandas 技巧
充分利用 Pandas
如果您正在阅读本文,那么您一定听说过或使用过 Pandas。因此,我将跳过我谈论 Pandas 有多棒的部分。 😊
在本文中,我们将通过示例演示一些不常用的 Pandas 功能。在我 3 年的熊猫之旅中,我并没有经常遇到它们。
学习 Pandas 或任何其他软件工具的最佳方式是练习。这就是我们要做的。第一步是创建一个示例 DataFrame 来处理。
import numpy as np
import 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 中,操作日期的函数在 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]
感谢您的阅读。如果您有任何反馈,请告诉我。
文章出处登录后可见!