如何使用正则表达式和数据类型选择多个 DataFrame 列
DataFrame 可以比作保存在电子表格或数据库中的数据集,具有行和列。DataFrame 是一个二维对象。
好的,对一维和二维术语感到困惑?
一维 (Series) 和二维 (DataFrame) 的主要区别在于,你需要多少个信息点才能得到单个数据点。以 Series 为例,如果要提取一个值,只需要一个参考点,即行索引。
相比之下,对于表格 (DataFrame),一个参考点不足以获得数据点,需要行值和列值的交集。
下面的代码片段展示了如何从 csv 文件创建 Pandas DataFrame。
.read_csv() 方法默认创建 DataFrame。 你可以在 kaggle.com 搜索电影来下载电影数据集。
"""Script : Create a Pandas DataFrame from a csv file.""" import pandas as pd movies_dataset pd read_csv "https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv") # 1 print the type of object type(movies_dataset) # 2 print the top 5 records in a tabular format movies_dataset head(5)
| 预算 | ID | 原始语言 | 原始标题 | 受欢迎程度 | 发行日期 | 收入 | 片长 | 状态 | 标题 | 平均投票 | 投票数 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 英文 | 阿凡达 | 150.437577 | 10/12/2009 | 2787965087 | 162.0 | 已发行 | 阿凡达 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 英文 | 加勒比海盗:世界的尽头 | 139.082615 | 19/05/2007 | 961000000 | 169.0 | 已发行 | 加勒比海盗:世界的尽头 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 英文 | 007:幽灵党 | 107.376788 | 26/10/2015 | 880674609 | 148.0 | 已发行 | 007:幽灵党 | 6.3 | 4466 |
| 3 | 250000000 | 49026 | 英文 | 蝙蝠侠:黑暗骑士崛起 | 112.312950 | 16/07/2012 | 1084939099 | 165.0 | 已发行 | 蝙蝠侠:黑暗骑士崛起 | 7.6 | 9106 |
| 4 | 260000000 | 49529 | 英文 | 约翰·卡特 | 43.926995 | 7/03/2012 | 284139100 | 132.0 | 已发行 | 约翰·卡特 | 6.1 | 2124 |
2. 选择单个 DataFrame 列。将列名作为字符串或列表传递给索引运算符将返回列值作为 Series 或 DataFrame。
如果我们传入列名的字符串,则输出为 Series,但是,传入只有一个列名的列表将返回 DataFrame。我们将通过示例说明这一点。
# select the data as series movies_dataset["title"]
0 Avatar 1 Pirates of the Caribbean: At World's End 2 Spectre 3 The Dark Knight Rises 4 John Carter ... 4798 El Mariachi 4799 Newlyweds 4800 Signed, Sealed, Delivered 4801 Shanghai Calling 4802 My Date with Drew Name: title, Length: 4803, dtype: object
# select the data as DataFrame movies_dataset[["title"]]
| 标题 | |
|---|---|
| 0 | 阿凡达 |
| 1 | 加勒比海盗:世界的尽头 |
| 2 | 007:幽灵党 |
| 3 | 蝙蝠侠:黑暗骑士崛起 |
| 4 | 约翰·卡特 |
| ... | ... |
| 4798 | 爱尔玛丽亚奇 |
| 4799 | 新婚夫妇 |
| 4800 | 签署、密封、递送 |
| 4801 | 上海来电 |
| 4802 | 我和德鲁的约会 |
3. 选择多个 DataFrame 列。
# Multiple DataFrame columns movies_dataset[["title""runtime","vote_average","vote_count"]]
| 标题 | 片长 | 平均投票 | 投票数 | |
|---|---|---|---|---|
| 0 | 阿凡达 | 162.0 | 7.2 | 11800 |
| 1 | 加勒比海盗:世界的尽头 | 169.0 | 6.9 | 4500 |
| 2 | 007:幽灵党 | 148.0 | 6.3 | 4466 |
| 3 | 蝙蝠侠:黑暗骑士崛起 | 165.0 | 7.6 | 9106 |
| 4 | 约翰·卡特 | 132.0 | 6.1 | 2124 |
| ... | ... | ... | ... | ... |
| 4798 | 爱尔玛丽亚奇 | 81.0 | 6.6 | 238 |
| 4799 | 新婚夫妇 | 85.0 | 5.9 | 5 |
| 4800 | 签署、密封、递送 | 120.0 | 7.0 | 6 |
| 4801 | 上海来电 | 98.0 | 5.7 | 7 |
| 4802 | 我和德鲁的约会 | 90.0 | 6.3 | 16 |
为了避免代码可读性问题,我始终建议定义一个变量来保存列名列表,并使用列名而不是在代码中指定多个列名。
columns=["title","runtime","vote_average","vote_count"]movies_dataset[columns]
| 标题 | 片长 | 平均投票 | 投票数 | |
|---|---|---|---|---|
| 0 | 阿凡达 | 162.0 | 7.2 | 11800 |
| 1 | 加勒比海盗:世界的尽头 | 169.0 | 6.9 | 4500 |
| 2 | 007:幽灵党 | 148.0 | 6.3 | 4466 |
| 3 | 蝙蝠侠:黑暗骑士崛起 | 165.0 | 7.6 | 9106 |
| 4 | 约翰·卡特 | 132.0 | 6.1 | 2124 |
| ... | ... | ... | ... | ... |
| 4798 | 爱尔玛丽亚奇 | 81.0 | 6.6 | 238 |
| 4799 | 新婚夫妇 | 85.0 | 5.9 | 5 |
| 4800 | 签署、密封、递送 | 120.0 | 7.0 | 6 |
| 4801 | 上海来电 | 98.0 | 5.7 | 7 |
| 4802 | 我和德鲁的约会 | 90.0 | 6.3 | 16 |
4. 通过列名选择 DataFrame 列。
.filter() 方法
此方法非常方便地使用字符串搜索和选择列。它的工作方式与 SQL 中的 like %% 参数非常相似。请记住,.filter() 方法仅通过检查列名而不是实际数据值来选择列。
.filter() 方法支持三个可用于选择操作的参数。
.like
.regex
.items
like parameter takes a string and attempts to find the column names that contain this string somewhere in the column name.
# Select the column that have a column name like "title" movies_dataset.filter(like="title").head(5)
| 原始标题 | 标题 | |
|---|---|---|
| 0 | 阿凡达 | 阿凡达 |
| 1 | 加勒比海盗:世界的尽头 | 加勒比海盗:世界的尽头 |
| 2 | 007:幽灵党 | 007:幽灵党 |
| 3 | 蝙蝠侠:黑暗骑士崛起 | 蝙蝠侠:黑暗骑士崛起 |
| 4 | 约翰·卡特 | 约翰·卡特 |
.regex – 使用正则表达式选择列名更灵活的方式
# Select the columns that end with "t" movies_dataset.filter(regex=t).head()
| 预算 | 投票数 | |
|---|---|---|
| 0 | 237000000 | 11800 |
| 1 | 300000000 | 4500 |
| 2 | 245000000 | 4466 |
| 3 | 250000000 | 9106 |
| 4 | 260000000 | 2124 |
.items – 与将列名作为字符串或列表传递给索引运算符相同,只是不会引发 KeyError
按数据类型选择 DataFrame 列。
如果您有兴趣过滤和仅使用某些数据类型,则 .select_dtypes 方法适用于列数据类型。
同样,.select_dtypes 方法在其 include 或 exclude 参数中接受多个数据类型(通过列表)或单个数据类型(作为字符串),并返回一个只包含那些给定数据类型的列的 DataFrame。
.include 参数包含具有指定数据类型/类型的列,而 .exclude 将忽略具有指定数据类型的列。
让我们首先查看数据类型以及具有这些数据类型的列的数量
movies_dataset=pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv"
movies_dataset.dtypes.value_counts()object 5 int64 4 float64 3 dtype: int64
a) 从 pandas DataFrame 中过滤整数数据类型。
movies_dataset select_dtypes(include="int")head(3)
| 2 |
|---|
| 1 |
| 0 |
b). 从 pandas DataFrame 中选择整数和浮点数据类型。
您可以如下所示指定多个数据类型作为列表。
movies_dataset select_dtypes(include=["int64","float"]).head(3)
| 预算 | ID | 受欢迎程度 | 收入 | 片长 | 平均投票 | 投票数 | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
c) 好吧,如果您只需要所有数值数据类型,只需指定 number
movies_dataset select_dtypes(include=["number"]).head(3)
| 预算 | ID | 受欢迎程度 | 收入 | 片长 | 平均投票 | 投票数 | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
d). 从 pandas DataFrame 中排除某些数据类型。
movies_dataset select_dtypes(exclude=["object"]).head(3)
| 预算 | ID | 受欢迎程度 | 收入 | 片长 | 平均投票 | 投票数 | |
|---|---|---|---|---|---|---|---|
| 0 | 237000000 | 19995 | 150.437577 | 2787965087 | 162.0 | 7.2 | 11800 |
| 1 | 300000000 | 285 | 139.082615 | 961000000 | 169.0 | 6.9 | 4500 |
| 2 | 245000000 | 206647 | 107.376788 | 880674609 | 148.0 | 6.3 | 4466 |
**注意**:没有字符串数据类型可处理,pandas 将它们转换为对象,因此如果您遇到异常“TypeError: 数据类型“string”无法理解”,请将 string 替换为 Object。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP