在本文中,将演示一些不常见,然而却十分有用的 Pandas 函数。

创立一个示例 DataFrame 。

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“实现工夫序列。

让咱们为年月和季度创立新列。

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

还能够查看 DataFrame 中不同的年月和季度值。

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 函数。它计算列中值的累积和。以下是咱们通常的应用形式:

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数据类型

咱们常常须要解决具备无限且固定数量的值的分类数据。例如在咱们的 DataFrame 中,”分类“列具备 4 个不同值的分类变量:A、B、C、D。

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

df.dtypes# outputdate              datetime64[ns]class                     objectamount                     int64month                  period[M]quarter            period[Q-DEC]cumulative_sum             int64class_cum_sum              int64

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

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 列的内存耗费。

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

class_category 列耗费的内存不到 class 列的一半。差别是 496 字节,尽管并不多。然而当咱们应用大型数据集时,这样差别就会被放大,这样就变成了节俭大量的空间。

https://avoid.overfit.cn/post/a153164fae64466b800e1d3d596abbbd

作者:Soner Yıldırım