如何高效获取 Pandas DataFrame 中列的数据类型

在使用 Python 进行数据清洗或分析时,你是否曾遇到过这样的困惑:刚刚加载了一个庞大的数据集,正准备开始大展拳脚,却突然因为某一列的数据类型不匹配而报错?比如,你想计算“销售额”的平均值,结果系统却告诉你该列是字符串类型。这种情况非常常见,而解决它的第一步,就是准确且高效地获取每一列的数据类型。

在数据科学领域,Pandas 是我们手中的瑞士军刀,而 DataFrame 则是我们处理数据的主要战场。了解每一列的数据类型不仅能帮助我们避免类型错误,还能指导我们进行内存优化和数据转换。

在今天的文章中,我们将深入探讨如何使用 Pandas 来检查 DataFrame 中列的数据类型。我们会从基础的数据类型概念讲起,详细介绍最常用的 INLINECODEf6d5aedb 属性和 INLINECODE11e1e696 方法,并通过丰富的实战代码示例,展示它们在不同场景下的应用。无论你是刚入门的数据分析师,还是寻求最佳实践的资深开发者,我相信你都能在这篇文章中找到实用的答案。

准备工作:创建示例数据

为了让我们更直观地理解,首先让我们创建一个包含员工信息的 Pandas DataFrame。这个数据集包含了混合类型的数据:字符串(姓名)、整数(年龄)、字符串(城市)和整数(薪资)。

# 导入 pandas 库
import pandas as pd

# 定义员工数据列表(包含元组)
employees = [
    (‘Stuti‘, 28, ‘Varanasi‘, 20000),
    (‘Saumya‘, 32, ‘Delhi‘, 25000),
    (‘Aaditya‘, 25, ‘Mumbai‘, 40000),
    (‘Saumya‘, 32, ‘Delhi‘, 35000),
    (‘Saumya‘, 32, ‘Delhi‘, 30000),
    (‘Saumya‘, 32, ‘Mumbai‘, 20000),
    (‘Aaditya‘, 40, ‘Dehradun‘, 24000),
    (‘Seema‘, 32, ‘Delhi‘, 70000)
]

# 创建 DataFrame,并指定列名
df = pd.DataFrame(employees, 
                  columns=[‘Name‘, ‘Age‘, ‘City‘, ‘Salary‘])

# 显示 DataFrame
print(df)

输出示例:

     Name  Age     City  Salary
0   Stuti   28  Varanasi   20000
1  Saumya   32     Delhi   25000
2 Aaditya   25    Mumbai   40000
3  Saumya   32     Delhi   35000
4  Saumya   32     Delhi   30000
5  Saumya   32    Mumbai   20000
6 Aaditya   40  Dehradun   24000
7   Seema   32     Delhi   70000

现在,我们已经有了一个可以操作的数据对象。接下来,让我们看看如何“解剖”它的内部结构。

方法 1:使用 dtypes 属性精准查看类型

在 Pandas 中,获取列数据类型最直接、最常用的方法就是使用 DataFrame 的 .dtypes 属性。这就好比我们在查看一份体检报告上的各项指标。

#### 语法和参数

  • 语法: DataFrame.dtypes
  • 参数: 无
  • 返回值: 返回一个 pandas Series 对象,其中索引是列名,值是对应的数据类型(dtype)。

#### 实战示例 1:获取所有列的数据类型

当我们想要对整个表的数据结构有一个宏观的把控时,可以直接打印 df.dtypes。它会告诉我们每一列当前的数据类型。

# 使用 .dtypes 属性获取所有列的数据类型
datatypes = df.dtypes

# 打印结果
print("所有列的数据类型:")
print(datatypes)

输出结果:

Name        object
Age          int64
City        object
Salary       int64
dtype: object

代码深度解析:

  • 返回类型:注意输出的格式,这实际上是一个 pandas Series。这意味着我们可以对它进行索引操作。
  • 数据类型含义

* object: 通常表示字符串或混合类型。在这个例子中,‘Name‘ 和 ‘City‘ 是字符串。

* int64: 表示 64 位整数。‘Age‘ 和 ‘Salary‘ 被自动识别为整数。

#### 实战示例 2:获取单列的数据类型

有时候,我们只关心某一列。比如,我们想确认 ‘Salary‘ 列是否真的是整数类型,以便后续进行除法运算。我们可以通过列名索引来获取。

# 通过列名索引,获取 ‘Salary‘ 列的具体数据类型
salary_type = df.dtypes[‘Salary‘]

# 打印结果
print(f"‘Salary‘ 列的数据类型是: {salary_type}")

# 检查类型是否为整数
if salary_type == ‘int64‘:
    print("没错,我们可以安全地进行数学运算。")

输出结果:

‘Salary‘ 列的数据类型是: int64
没错,我们可以安全地进行数学运算。

这种单列查询在编写自动化脚本时非常有用,例如在执行不安全操作前先进行类型检查。

#### 实战示例 3:条件筛选与类型转换

让我们来点稍微高级的操作。假设我们需要找出 DataFrame 中所有类型为 INLINECODE820681cf(字符串)的列,并将它们转换为 INLINECODEe9015ca1 类型以节省内存(这在处理包含大量重复文本的数据时非常有效)。

# 1. 找出所有类型为 object 的列名
object_cols = df.dtypes[df.dtypes == ‘object‘].index.tolist()
print(f"需要进行优化的字符串列: {object_cols}")

# 2. 将这些列转换为 category 类型(通常能节省内存)
for col in object_cols:
    df[col] = df[col].astype(‘category‘)

# 3. 再次查看 dtypes,验证结果
print("
优化后的数据类型:")
print(df.dtypes)

输出结果:

需要进行优化的字符串列: [‘Name‘, ‘City‘]

优化后的数据类型:
Name      category
Age          int64
City      category
Salary       int64
dtype: object

通过这个例子,你可以看到 .dtypes 不仅仅用于查看,更是数据清洗流程中的决策依据。

方法 2:使用 info() 方法获取完整概览

如果说 INLINECODE3cf950cd 是“体检报告”,那么 INLINECODE2e9e297f 方法就是“病历综述”。它不仅告诉你数据类型,还会提供数据框的概览信息,包括内存使用情况、非空值数量等。

#### 语法和参数

  • 语法: DataFrame.info(verbose=None, buf=None, max_cols=None, memory_usage=None, null_counts=None)
  • 主要参数说明

* INLINECODE5414df39: 是否打印完整摘要。INLINECODEfc65442a 表示打印所有信息;False 表示仅打印简要信息。

* INLINECODE9f0090d9: 指定是否显示内存使用情况。INLINECODE890e930f 或 ‘deep‘ 会计算更精确的内存占用。

#### 实战示例 4:使用 info() 诊断数据质量

当我们第一次拿到数据时,通常首选 .info()。它能让我们迅速发现缺失值和类型异常。

# 打印 DataFrame 的完整摘要
print("DataFrame 详细信息摘要:")
df.info()

输出结果:


RangeIndex: 8 entries, 0 to 7
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype   
---  ------  --------------  -----   
 0   Name    8 non-null      category
 1   Age     8 non-null      int64   
 2   City    8 non-null      category
 3   Salary  8 non-null      int64   
dtypes: category(2), int64(2)
memory usage: 738.0 bytes

关键信息解读:

  • Non-Null Count (非空计数): 我们可以看到每一列都有 8 个非空值,这说明目前数据没有缺失。如果某列的非空值少于总行数,你就知道需要在数据清洗阶段处理缺失值了。
  • Memory Usage (内存使用量): 底部显示了数据框占用的内存。优化数据类型(如刚才的 object 转 category)后,你会发现内存使用量显著下降。

#### 实战示例 5:深入内存分析

INLINECODE04294d4d 的强大之处在于它能帮你分析大文件的内存瓶颈。让我们使用 INLINECODE9fdde522 参数来看一下。

# 使用 deep 模式查看更精确的内存占用
print("精确内存占用分析:")
df.info(memory_usage=‘deep‘)

通过这种方式,你可以发现那些看起来占用不大,但实际上因为存储了大量字符串而非常“重”的列,从而指导你进行针对性的优化。

常见问题与最佳实践

在实际开发中,你可能会遇到一些令人头疼的问题。让我们来看看如何解决它们。

#### 场景 1:日期列被识别为 Object

这是最常见的问题。当你从 CSV 读取数据时,Pandas 通常默认将日期识别为字符串(Object)。

# 模拟读取数据时日期被当作字符串的情况
# 假设我们有一个 Join_Date 列
df[‘Join_Date‘] = [‘2020-01-01‘, ‘2021-05-15‘, ‘2019-11-30‘] * 3 + [‘2022-02-01‘]

print("查看 Join_Date 列的原始类型:")
print(df.dtypes[‘Join_Date‘]) # 输出很可能是 object

# 解决方案:使用 pd.to_dtype 转换
df[‘Join_Date‘] = pd.to_datetime(df[‘Join_Date‘])

print("
转换后的类型:")
print(df.dtypes[‘Join_Date‘]) # 输出为 datetime64[ns]

实用建议:在读取 CSV 文件时,如果知道某些列是日期,最好直接在 INLINECODE597c7d23 函数中使用 INLINECODE7de78835 参数,这样一步到位,避免后续转换。

#### 场景 2:混合类型导致识别错误

有时候,一列中既包含数字又包含字符串,Pandas 会将这整列统统标记为 object。这通常意味着数据源存在脏数据。

# 混合数据类型的例子
mixed_data = pd.DataFrame({‘Mixed_Col‘: [1, 2, ‘Error‘, 4]})

print("混合类型的列的 dtype:")
print(mixed_data.dtypes[‘Mixed_Col‘]) # 输出 object

print("
列的内容:")
print(mixed_data)

解决思路:遇到这种情况,不要急着转换类型。你应该先用 INLINECODE5025560c 将无法转换的字符串变为 INLINECODE4589556f(空值),然后再决定是填充这些空值还是删除它们。

#### 场景 3:int64 还是 int32?—— 内存优化

如果你的数据集非常大(例如数百万行),默认的 INLINECODE654478ca(64位整数)可能会浪费内存。如果你的数值范围较小(例如年龄在 0-120 之间),使用 INLINECODE4fd3a36c 或 int16 可以节省 75% 以上的空间。

# 原始类型
print(f"Age 列原始类型: {df[‘Age‘].dtype}")

# 向下转换类型
df[‘Age‘] = df[‘Age‘].astype(‘int8‘) # int8 足以存储年龄

print(f"Age 列优化后类型: {df[‘Age‘].dtype}")

总结与后续步骤

在 Pandas 的日常使用中,检查数据类型是构建稳健数据管道的基石。在今天的文章中,我们一起探索了两种核心方法:

  • df.dtypes: 当你需要针对特定列进行逻辑判断、类型筛选或快速浏览时,这是你的首选工具。
  • df.info(): 当你需要全面评估数据健康状况、排查缺失值或分析内存占用时,这个方法能提供全景视角。

掌握这两者,你就拥有了处理类型不匹配、优化内存占用以及清洗脏数据的能力。下次当你看到 INLINECODE00b31254 或者是 INLINECODE3afad64a 的报错时,不妨先停下来,用这两个方法检查一下你的数据类型。

我建议你在你的下一个项目中尝试以下练习:

  • 找一个超过 10MB 的 CSV 文件。
  • 使用 info(memory_usage=‘deep‘) 检查它的内存占用。
  • 尝试将 INLINECODE278bd94a 类型转为 INLINECODE755d3d50,将 INLINECODEf70920ec 降级为 INLINECODEea900695 或 int16
  • 看看你能节省多少内存空间。

希望这篇文章能帮助你更好地理解 Pandas 的数据类型机制。祝你在数据科学的学习之路上越走越远!

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/34304.html
点赞
0.00 平均评分 (0% 分数) - 0