迈克尔·麦考利

机器学习之旅必须知道的 Pandas 函数

源节点: 1865356

这篇文章是作为 数据科学博客马拉松

介绍

嗯,很有可能你可以!

对于使用 Python 作为主要编程语言的数据科学家来说,Pandas 包是必备的数据分析工具。 Pandas 包拥有数据科学家所需的一切,每门课程一开始都教我们如何使用它。 它非常大、功能强大,几乎可以执行您能想象到的所有表格操作。 然而,这种广度有时可能是一个缺点。

它有许多漂亮的功能,可以解决罕见的边缘情况和不同的场景。

pandas 的主要缺点之一是它难以处理大型数据集,因为 pandas 将其数据结构存储在 RAM 中,随着数据大小的增长,这可能会变得不够用。 为此,请使用 PySpark 或 Dask。

尽管 Pandas 包被广泛使用,但仍然有很多功能被人们忽略,无论是因为它使用得少,还是因为他们不知道它的存在。 这篇文章旨在重新向您介绍这些功能,并证明 Pandas 比您以前意识到的要强大得多。

U型槽

要在 pandas 中以简洁、紧凑的方式执行数据清理,可以使用 Pipe 函数,它允许您在一次操作中组合多个函数。

例如,如果您想应用诸如 drop_duplicates、encode_categoricals、remove_outliers 等接受其参数的函数。

df_cleaned = (diamonds.pipe(drop_duplicates).pipe(remove_outliers, ['price', 'carat', 'depth']). pipe(encode_categoricals, ['cut', 'color', 'clarity'])

分解

此功能是 Sklearns 标签编码器的替代品。

# 注意末尾的 [0] diamonds["cut_enc"] = pd.factorize(diamonds["cut"])[0] >>> diamonds["cut_enc"].sample(5) 52103 2 39813 0 31843 0 10675 0 6634 0 名称:cut_enc,数据类型:int64

因式分解会产生一组值:编码值和唯一类别列表。

values, unique = pd.factorize(diamonds["cut"], sort=True) >>> values[:10] array([0, 1, 3, 1, 3, 2, 2, 2, 4, 2] , dtype=int64) >>> 独特的 ['Ideal', 'Premium', 'Very Good', 'Good', 'Fair']

爆炸

爆炸 | 熊猫函数

照片由 埃德瓦·福斯特 on Unsplash

Explode 是一个名字很有趣的函数。 让我们从一个例子开始,然后是一个解释:

df = pd.Series([1, 6, 7, [46, 56, 49], 45, [15, 10, 12]]).to_frame("脏") >>> df
数据 | 熊猫函数
图片作者

特征列有两行用列表表示。 这种类型的数据在一些问题接受多项选择的调查中可用。

>>> df.explode("脏", ignore_index=True)
数据爆炸
图片作者

此函数采用具有值数组的单元格并在多行中展开。 要维护数字索引的顺序,请将 ignore_index 用作 True。

之间

对于范围内的布尔索引数字特征,这是一个方便的函数:

# 获取价格在 3500 到 3700 美元之间的钻石 diamonds[diamonds["price"].between(3500, 3700, inclusive="neither")].sample(5)
数据之间 | 熊猫函数
图片作者

 

T

DataFrame 有一个简单的 T 属性,称为转置。 我们可能不会经常使用它,describe 方法在查看数据帧时很有帮助。

>>> boston.describe().T.head(10)
转
图片作者

 

熊猫选项

可以使用 pandas 的全局设置来帮助调整和更改默认行为。

>>> dir(pd.options) ['compute', 'display', 'io', 'mode', 'plotting']

它由5个模块组成。 让我们看看显示屏下的可用选项。 有很多可用的选项,但我主要使用 max_columns。

>>> dir(pd.options.display) ['chop_threshold', 'max_columns', 'max_colwidth', 'max_info_columns', 'max_info_rows', 'max_rows', ... 'precision', 'show_dimensions', 'unicode' , '宽度']

大多数人使用 max_columns 和precision

# 去掉显示列数的限制 pd.options.display.max_columns = None # 只显示小数点后5个数字 pd.options.display.precision = 5 # 去掉科学记数法

转换_dtypes

我们都知道 pandas 有一个讨厌的习惯,就是将某些列标记为对象数据类型。 您可以使用 convert dtypes 方法,而不是直接定义它们的类型,该方法试图推断出最佳数据类型:

sample = pd.read_csv("data/station_day.csv",usecols=["StationId", "CO", "O3", "AQI_Bucket"]) >>> sample.dtypes StationId object CO float64 O3 float64 AQI_Bucket object dtype: object >>> sample.convert_dtypes().dtypes StationId string CO float64 O3 float64 AQI_Bucket string dtype: object

选择_dtypes

从名字上,我相信功能的作用就很清楚了。 您可以使用包含和排除选项来指定包含或省略特定数据类型的列。

仅选择带有 np.number 的数字列,例如:

# 只选择数字列 diamonds.select_dtypes(include=np.number).head()
选择数据类型
图片作者

 

口罩

此功能有助于替换不满足自定义条件的值。

# 创建样本数据ages = pd.Series([55, 52, 50, 66, 57, 59, 49, 60]).to_frame("ages")
面具 | 数据
图片作者

执行上述操作后。

进行了掩蔽
图片作者

最小和最大

尽管 min 和 max 是众所周知的,但对于某些边缘情况,它具有一些更好的属性。

索引 = [“钻石”、“泰坦尼克号”、“虹膜”、“心脏病”、“贷款违约”] 库 = [“XGBoost”、“CatBoost”、“LightGBM”、“Sklearn GB”] df = pd.DataFrame ( {lib: np.random.uniform(90, 100, 5) for lib in libraries}, index=index ) >>> df
最小值和最大值
图片作者 

上面虚构的 DataFrame 显示了四个不同梯度提升库在五个数据集上的结果。 我们正在寻找在每个数据集上表现最好的包。 以下是如何以优雅的方式使用 max 来完成它:

>>> df.max(axis=1) Diamonds 99.52684 Titanic 99.63650 Iris 99.10989 Heart disease 99.31627 Loan Default 97.96728 dtype: float64

N最大和N最小

nlargest 和 nsmallest 有助于查看变量的前 N ​​或 ~(前 N) 个值。

diamonds.nlargest(5, "价格")
最大和最小
图片作者
diamonds.nsmallest(5, "价格")
最小的
图片作者

 

Idxmax 和 Idxmin

当您在列上调用 max 或 min 时,Pandas 会返回最大/最小数字。 但是,在某些情况下,您需要这些函数不提供的最小值/最大值的位置。

相反,您可以使用 idxmax/idxmin:

>>> diamonds.price.idxmax() 27749 >>> diamonds.carat.idxmin() 14

值_计数

查找缺失值百分比的常用方法是将 isnull 与求和并除以数组的大小相结合。

但是,带有相关参数的 value_counts 做同样的事情:

住房 = pd.read_csv("train.csv") >>> 住房["FireplaceQu"].value_counts(dropna=False, normalize=True) NaN 0.47260 Gd 0.26027 TA 0.21438 Fa 0.02260 Ex 0.01644 Po 0.01370 名称:FireplaceQu,dtype:浮动64

剪辑功能有助于查找范围之外的异常值并用硬限制替换它们。

>>> 年龄.clip(50, 60)
剪辑数据
图片作者

 

At_time 和 Between_time

这些函数在处理高粒度时间序列时很有帮助。

at_time 有助于获取特定日期或时间的值。

index = pd.date_range("2021-08-01", period=100, freq="H") df = pd.DataFrame({"col": list(range(100))}, index=index) >> > df.head()
at_time 示例 | 熊猫函数
图片作者

>>> df.at_time(“15:00”)

.at_time | 熊猫函数
图片作者

between_time 用于获取自定义范围内的行。

从日期时间导入日期时间 >>> df.between_time("09:45", "12:00")
时间之间
图片作者

 

日期范围

此功能有助于创建具有工作日频率的时间序列指数。 金融界有这种频率。 因此,在使用 reindex 函数重新索引时间序列时,此函数可能会有所帮助。

series = pd.bdate_range("2021-01-01", "2021-01-31") # 一个月的周期 >>> len(series) 21

At 和 Iat

这两个访问器比 loc 和 iloc 快得多。 但是,它们有一个缺点。 它们只允许您一次选择或替换一个值:

# [index, label] >>> diamonds.at[234, "cut"] 'Ideal' # [index, index] >>> diamonds.iat[1564, 4] 61.2 # 替换价格列第16541行 >> > diamonds.at[16541, "价格"] = 10000

阿格索特

此函数有助于提取对特征数组进行排序的索引。

tips.reset_index(inplace=True, drop=True) sort_idx = Tips["total_bill"].argsort(kind="mergesort") # 现在,根据total_bill对`tips`进行排序tips.iloc[sort_idx].head()
arg_sort
图片作者

 

猫配件

pandas 允许使用 str 或 dt 等访问器在日期和字符串上内置 python 函数。

>>> diamonds.dtypes 克拉 float64 切工类别 颜色类别 净度类别 深度 float64 表 float64 价格 int64 x float64 y float64 z float64 cut_enc int64 dtype: object

可以使用 cat 访问器在分类列上使用许多特殊功能。 它具有诸如查找唯一的类别、重命名特征的 rename_categories 等功能。

diamonds["new_cuts"] = diamonds["cut"].cat.rename_categories(list("ABCDE")) >>> diamonds["new_cuts"].cat.categories Index(['A', 'B', ' C', 'D', 'E'], dtype='object')

查看此功能以获取更多功能列表 猫存取器.

Squeeze 是在罕见但恶化的边缘情况下使用的功能。

当从用于子集 DataFrame 的条件返回单个值时,这是其中一种情况。 考虑以下场景:

子集 = diamonds.loc[diamonds.index >> 子集
车资

即使只有一个单元格,也返回 DataFrame。 这很不方便,因为您现在必须使用.loc 与列名和索引来获取价格。

如果您知道如何挤压,则不必这样做。 可以使用此函数从单个单元格 DataFrame 或 Series 中删除轴。 考虑以下场景:

>>> 子集.squeeze() 326

可以指定要删除的轴。 它现在只返回标量。

>>> subset.squeeze("columns") # or "rows" 0 326 名称:价格,数据类型:int64

请注意,此函数仅适用于具有单个值的 Series 或 DataFrame。

Excel_writer

它是一个用于创建 excel 文件并在其中写入 DataFrame 的通用类。 考虑一下,我们有这两个数据集。

# 加载两个数据集 diamonds = sns.load_dataset("diamonds") tips = sns.load_dataset("tips") # 以 pd.ExcelWriter("data/data.xlsx") 作为 writer 写入同一个 excel 文件: diamonds.to_excel (writer, sheet_name="diamonds") tips.to_excel(writer, sheet_name="tips")

它具有指定要使用的 DateTime 格式的属性,无论您需要新文件还是修改现有文件,如果存在工作表会发生什么。 检查这个 文件 以获得更多细节。

结论

这不是对 pandas 的详尽概述,而且 文件 包含有关代码和功能的更多信息。 我建议您尝试此处提供的代码片段的不同变体以及各种参数。 这样做可以充分理解熊猫的力量。

像 Dask 和 datatable 这样的库正在逐渐取代 Pandas 处理大型数据集的华丽新功能,Pandas 仍然是 Python 数据科学社区中使用最广泛的数据操作工具。 由于它非常适合当前的 SciPy 堆栈,因此该库可作为其他包遵循和构建的范例。

我希望您发现这篇文章很有见地,并感谢您的阅读。

本文中显示的媒体不归 Analytics Vidhya 所有,由作者自行决定使用。

资料来源:https://www.analyticsvidhya.com/blog/2021/08/must-know-pandas-functions-for-machine-learning-journey/

时间戳记:

更多来自 分析维迪亚