Python
快速将 Pandas 字典转换为 DataFrame: 初学者指南

快速将 Pandas 字典转换为 DataFrame: 初学者指南

MoeNagy Dev

将 Python 字典转换为 Pandas DataFrame

Pandas DataFrame: 数据操作的强大工具

了解 Pandas DataFrame

Pandas DataFrame 是 Python 中一种强大的数据结构,提供了一套全面的工具用于数据操作、分析和可视化。它建立在 NumPy 库之上,以类似电子表格的二维表格式表示数据,允许您存储和处理结构化数据。

主要特点和优势

  • 表格数据结构: Pandas DataFrame 以行和列的形式表示数据,呈现出表格式的数据结构。
  • 异构数据类型: DataFrame 可以在同一结构中存储不同数据类型的数据,使其能够处理各种类型的数据集。
  • 高效的数据操作: Pandas 提供了丰富的方法和函数,用于过滤、排序、分组和转换数据,简化了数据分析和预处理任务。
  • 缺失数据处理: DataFrame 内置了对缺失数据的处理支持,可以轻松识别、替换或插值缺失值。
  • 集成可视化: Pandas 与 Matplotlib 和 Seaborn 等数据可视化库无缝集成,可以直接从 DataFrame 生成信息丰富的图表和图形。
  • 可扩展性和性能: Pandas 经过优化,可以高效地处理大型数据集,适用于大数据场景。

将 Python 字典转换为 Pandas DataFrame

定义字典字典

让我们从创建一个 Python 字典开始,我们将用它来演示转换为 Pandas DataFrame。在这个例子中,我们将创建一个字典,代表不同汽车的信息:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000]
}

从字典创建 DataFrame

要将 Python 字典转换为 Pandas DataFrame,您可以使用 pd.DataFrame() 函数:

import pandas as pd
 
df = pd.DataFrame(car_data)
print(df)

输出:

       make    model  year  price
0    Toyota   Camry  2020  25000
1     Honda   Civic  2018  22000
2      Ford  Mustang  2022  35000
3  Chevrolet Silverado  2019  40000
4     Nissan   Altima  2021  27000

结果 df 变量是一个 Pandas DataFrame,包含来自 car_data 字典的数据。

处理具有不同值类型的字典

Pandas DataFrame 可以处理具有不同值类型(如列表、元组或其他字典)的字典。让我们修改 car_data 字典,包含一些嵌套数据:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000],
    'features': [
        {'engine': 'V6', 'transmission': 'automatic', 'drivetrain': 'FWD'},
        {'engine': 'I4', 'transmission': 'manual', 'drivetrain': 'FWD'},
        {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': 'RWD'},
        {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': '4WD'},
        {'engine': 'I4', 'transmission': 'CVT', 'drivetrain': 'FWD'}
    ]
}
 
df = pd.DataFrame(car_data)
print(df)

输出:

       make    model  year  price          .
0    丰田   凯美瑞  2020  25000  {'发动机': 'V6', '变速箱': '自动', '驱动系统': '前驱'}
1     本田   思域  2018  22000  {'发动机': 'I4', '变速箱': '手动', '驱动系统': '前驱'}
2      福特  野马  2022  35000  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '后驱'}
3  雪佛兰 Silverado  2019  40000  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '四驱'}
4     日产   天籁  2021  27000  {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '前驱'}

在这个例子中, features 列包含了每辆车的附加信息, 以字典的形式表示。

处理嵌套字典

如果您有一个包含嵌套字典的字典, 您仍然可以从中创建一个 DataFrame。让我们考虑一个每辆车都有嵌套字典作为 features 的例子:

car_data = {
    'make': ['丰田', '本田', '福特', '雪佛兰', '日产'],
    'model': ['凯美瑞', '思域', '野马', 'Silverado', '天籁'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, 27000],
    'features': {
        '凯美瑞': {'发动机': 'V6', '变速箱': '自动', '驱动系统': '前驱'},
        '思域': {'发动机': 'I4', '变速箱': '手动', '驱动系统': '前驱'},
        '野马': {'发动机': 'V8', '变速箱': '自动', '驱动系统': '后驱'},
        'Silverado': {'发动机': 'V8', '变速箱': '自动', '驱动系统': '四驱'},
        '天籁': {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '前驱'}
    }
}
 
df = pd.DataFrame(car_data)
print(df)

输出:

       make    model  year  price                                           features
0      丰田   凯美瑞  2020  25000  {'发动机': 'V6', '变速箱': '自动', '驱动系统': '前驱'}
1       本田   思域  2018  22000  {'发动机': 'I4', '变速箱': '手动', '驱动系统': '前驱'}
2       福特   野马  2022  35000  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '后驱'}
3   雪佛兰 Silverado  2019  40000  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '四驱'}
4       日产   天籁  2021  27000  {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '前驱'}
4     日产   Altima  2021  27000  {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '...

在这种情况下,features列仍然包含每辆车的字典,但结构与前一个示例不同。

自定义 DataFrame

指定列顺序

您可以通过将列名列表传递给 pd.DataFrame() 函数来重新排列 DataFrame 的列顺序:

df = pd.DataFrame(car_data, columns=['make', 'model', 'price', 'year', 'features'])
print(df)

输出:

       make    model  price  year                                           features
0    丰田   Camry  25000  2020  {'发动机': 'V6', '变速箱': '自动', '驱动系统': '...
1     本田   Civic  22000  2018  {'发动机': 'I4', '变速箱': '手动', '驱动系统': '...
2      福特  Mustang  35000  2022  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '...
3  雪佛兰 Silverado  40000  2019  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '...
4     日产   Altima  27000  2021  {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '...

重命名列

您可以使用 rename() 方法重命名 DataFrame 的列:

df = df.rename(columns={'make': '制造商', 'model': '型号', 'price': '价格', 'year': '年份', 'features': '车辆特性'})
print(df)

输出:

        制造商    型号  价格  年份                                     车辆特性
0         丰田   Camry  25000  2020  {'发动机': 'V6', '变速箱': '自动', '驱动系统': '...
1          本田   Civic  22000  2018  {'发动机': 'I4', '变速箱': '手动', '驱动系统': '...
2         福特  Mustang  35000  2022  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '...
3     雪佛兰 Silverado  40000  2019  {'发动机': 'V8', '变速箱': '自动', '驱动系统': '...
4          日产   Altima  27000  2021  {'发动机': 'I4', '变速箱': 'CVT', '驱动系统': '...

处理缺失数据

如果您的字典包含缺失值,Pandas 将自动在 DataFrame 中处理它们。例如, 如果我们为 'Altima' 汽车添加一个缺失的 'price' 值:

car_data = {
    'make': ['Toyota', 'Honda', 'Ford', 'Chevrolet', 'Nissan'],
    'model': ['Camry', 'Civic', 'Mustang', 'Silverado', 'Altima'],
    'year': [2020, 2018, 2022, 2019, 2021],
    'price': [25000, 22000, 35000, 40000, None],
    'features': {
        'Camry': {'engine': 'V6', 'transmission': 'automatic', 'drivetrain': 'FWD'},
        'Civic': {'engine': 'I4', 'transmission': 'manual', 'drivetrain': 'FWD'},
        'Mustang': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': 'RWD'},
        'Silverado': {'engine': 'V8', 'transmission': 'automatic', 'drivetrain': '4WD'},
        'Altima': {'engine': 'I4', 'transmission': 'CVT', 'drivetrain': 'FWD'}
    }
}
 
df = pd.DataFrame(car_data)
print(df)

输出:

       make    model  year   price                                           features
0    Toyota   Camry  2020  25000.0  {'engine': 'V6', 'transmission': 'automatic', 'd...
1     Honda   Civic  2018  22000.0  {'engine': 'I4', 'transmission': 'manual', 'driv...
2      Ford  Mustang  2022  35000.0  {'engine': 'V8', 'transmission': 'automatic', 'd...
3  Chevrolet Silverado  2019  40000.0  {'engine': 'V8', 'transmission': 'automatic', 'd...
4     Nissan   Altima  2021       NaN  {'engine': 'I4', 'transmission': 'CVT', 'drivet...

'Altima' 汽车的缺失 'price' 值表示为 NaN

函数

Python 中的函数是可重复使用的代码块,用于执行特定的任务。它们允许您将程序分解为更小、更易管理的部分。函数可以接受参数(输入)并返回值(输出)。

以下是一个简单的函数示例,它接受两个数字作为参数并返回它们的和:

def add_numbers(a, b):
    # 返回两个数字的和
    return a + b
 
result = add_numbers(5, 3)
print(result)  # 输出: 8

在这个例子中, add_numbers 函数接受两个参数 ab,并返回它们的和。我们然后调用这个函数,并将结果存储在 result 变量中,最后打印出结果。使用参数 53 调用函数,并将结果存储在 result 变量中,然后打印出来。

函数也可以有默认参数,如果调用者没有提供该参数的值,则使用默认值:

def greet(name, message="Hello"):
    print(f"{message}, {name}!")
 
greet("Alice")  # 输出: Hello, Alice!
greet("Bob", "Hi")  # 输出: Hi, Bob!

在这个例子中,greet 函数有一个默认参数 message,默认值为 "Hello"。如果调用者没有提供 message 的值,则使用默认值。

函数作用域

在 Python 中,变量有特定的作用域,这决定了它们可以被访问的位置。在函数内部定义的变量被认为是局部变量,只能在函数内部访问。在函数外部定义的变量被认为是全局变量,可以从程序的任何地方访问。

下面是一个演示局部变量和全局变量差异的例子:

global_variable = 10
 
def my_function():
    local_variable = 5
    print(f"局部变量: {local_variable}")
    print(f"全局变量: {global_variable}")
 
my_function()  # 输出: 局部变量: 5, 全局变量: 10
 
print(local_variable)  # NameError: name 'local_variable' is not defined

在这个例子中,global_variable 是一个全局变量,可以从 my_function 函数内部和外部访问。但是,local_variable 是一个局部变量,只能在 my_function 内部访问。

模块和包

在 Python 中,模块是包含定义和语句的单个 Python 文件。包是相关模块的集合。

要使用一个模块,可以在 Python 脚本的开头 import 它。下面是一个例子:

import math
 
result = math.sqrt(16)
print(result)  # 输出: 4.0

在这个例子中,我们 importmath 模块,它提供了各种数学函数。然后我们使用 sqrt 函数.从 math 模块导入平方根函数计算 16 的平方根。

您也可以使用 from 关键字从模块中导入特定的函数或变量:

from math import sqrt
 
result = sqrt(16)
print(result)  # 输出: 4.0

在这个例子中, 我们直接从 math 模块导入 sqrt 函数, 这样就可以不用加 math. 前缀来使用它。

包是相关模块的集合。您可以通过将 Python 文件组织到目录中并在每个目录中添加一个 __init__.py 文件来创建自己的包。例如:

my_package/
    __init__.py
    module1.py
    module2.py

在这个例子中, my_package 是一个包, 包含两个模块 module1.pymodule2.py__init__.py 文件是必需的, 用于将目录标记为包。

您可以使用以下语法从包中导入模块:

import my_package.module1
result = my_package.module1.my_function()

或者, 您可以从包中导入特定的函数或变量:

from my_package.module2 import my_variable, my_function
print(my_variable)
my_function()

异常

异常是程序执行过程中发生的, 会中断正常程序流程的事件。Python 有一个内置的异常处理系统, 允许您优雅地处理这些事件。

下面是一个处理 ZeroDivisionError 异常的例子:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误: 除数为零")

在这个例子中, 我们尝试将 10 除以 0, 这将引发 ZeroDivisionError。我们使用 except 块捕获这个异常, 并打印一条错误消息。

您也可以在单个 try-except 块中处理多个异常:

try:
    result = int("abc")
except ValueError:
    print("错误: 无效的整数格式")
except TypeError:
    print("错误: 输入必须是字符串")

在这个例子中, 我们尝试将字符串 "abc" 转换为整数, 这将引发 ValueError。我们还捕获了可能发生的 TypeError 异常.将字符串 "abc" 转换为整数会引发 ValueError。我们还处理了 TypeError 异常,这可能会在将错误类型传递给 int() 函数时发生。

您也可以使用 finally 块来执行无论是否引发异常的代码:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误: 除以零")
finally:
    print("这段代码将始终运行")

在这个例子中,finally 块中的代码将无论除以零操作是否成功或引发异常都会运行。

结论

在本教程中,您已经学习了各种中级 Python 概念,包括函数、函数作用域、模块和包以及异常处理。这些概念对于构建更复杂和更健壮的 Python 应用程序至关重要。

请记住,提高 Python 技能的最佳方式是实践。尝试将这些概念应用到您自己的项目中,并尝试不同的用例。祝你好运!

MoeNagy Dev.