Python
轻松将字典转换为数据框: 初学者指南

轻松将字典转换为数据框: 初学者指南

MoeNagy Dev

为什么要将字典转换为数据框?

字典是Python中的一种基本数据结构,提供了一种灵活高效的存储和检索键值对的方式。但是,随着数据复杂性的增加,使用字典可能会变得繁琐,特别是当您需要进行高级数据分析或操作时。这时,Pandas数据框就派上用场了。

使用数据框相比字典的优势

  1. 表格数据结构: Pandas数据框提供了一种表格数据结构,使得处理具有明确结构(如行和列)的数据更加容易。这种结构有利于进行诸如过滤、排序和分组等操作,这些都是数据分析的基本需求。

  2. 强大的数据分析工具: Pandas数据框拥有丰富的数据分析工具和函数,如内置的缺失数据处理、数学运算和高级统计分析等。

  3. 高效的内存使用: Pandas数据框在处理大型数据集时,内存使用经过优化,比使用字典集合更加高效。

  4. 与其他库的良好互操作性: 数据框能够与NumPy、Matplotlib和Scikit-learn等其他流行的Python数据科学库无缝集成,让您可以将数据无缝地纳入更广泛的数据处理和可视化工作流。

这种转换在哪些场景下很有用

  • 数据清洗和预处理: 当您需要...使用来自各种来源的数据时,通常会以字典的形式接收数据。将这些字典转换为 DataFrames 可以简化数据清理和预处理步骤。

  • 数据分析和可视化: DataFrames 提供了一种结构化的格式,非常适合于数据分析,使您能够应用广泛的分析技术并创建有意义的可视化效果。

  • 机器学习和建模: 许多机器学习库(如 Scikit-learn)都需要以表格格式的数据作为输入,因此将字典转换为 DataFrames 是模型开发过程中的一个关键步骤。

  • 数据操作和转换: DataFrames 提供了丰富的函数和方法来操作数据,包括过滤、排序、分组和执行计算等,这些操作在使用字典集合时通常更加困难。

创建一个字典

让我们从定义一个简单的字典开始:

person = {
    "name": "John Doe",
    "age": 35,
    "city": "New York"
}

这个字典有三个键值对,其中键是字符串,值可以是字符串或整数。

处理具有嵌套结构的字典

字典也可以有嵌套结构,其中值可以是其他字典或列表。下面是一个例子:

person = {
    "name": "John Doe",
    "age": 35,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    },
    "hobbies": ["reading", "hiking", "photography"]
}

在这个例子中,"address" 键有一个字典作为其值,"hobbies" 键有一个列表作为其值。

将字典转换为 DataFrame

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

import pandas as pd
 
df = pd.DataFrame(person)

这将创建一个 DataFrame,其中列名为字典的键,行值为相应的值.以下是该 Markdown 文件的中文翻译。对于代码部分,只翻译注释,不翻译代码本身。文件开头没有添加任何额外的注释。

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

Pandas 能够处理具有不同数据类型值的字典。例如:

person = {
    "name": "John Doe",
    "age": 35,
    "is_employed": True,
    "salary": 50000.0
}
 
df = pd.DataFrame(person)

在这种情况下,DataFrame 将有 "name""age""is_employed""salary" 列,每一列都有适当的数据类型。

在 DataFrame 中保留字典结构

如果您有一个包含嵌套结构的字典,例如带有 "address""hobbies" 键的字典,Pandas 在转换为 DataFrame 时将保留此结构:

person = {
    "name": "John Doe",
    "age": 35,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    },
    "hobbies": ["reading", "hiking", "photography"]
}
 
df = pd.DataFrame(person)

生成的 DataFrame 将拥有嵌套的字典和列表结构作为单独的列。

自定义 DataFrame

指定列名

您可以在创建 DataFrame 时通过传递列名列表作为 columns 参数来指定列名:

columns = ["full_name", "age", "is_employed", "monthly_salary"]
df = pd.DataFrame(person, columns=columns)

这将创建一个具有指定列名的 DataFrame,即使原始字典的键不匹配。

处理缺失值

如果您的字典有缺失值,Pandas 将自动处理它们,在相应的 DataFrame 单元格中插入 NaN(Not a Number)值:

person = {
    "name": "Jane Doe",
    "age": 28,
    "city": None
}
 
df = pd.DataFrame(person)

生成的 DataFrame 将有一个 "city" 列,其中包含 NaN 值。

更改列的数据类型

您还可以在创建 DataFrame 时指定列的数据类型:

person = {
    "name": "John Doe",
   .
```这是一个 Markdown 文件,包含了一些 Python 代码示例。以下是中文翻译:
 
"age": "35",
    "is_employed": "True"
}
 
df = pd.DataFrame(person, dtype={"age": int, "is_employed": bool})

在这个例子中,"age" 列被转换为整数,"is_employed" 列被转换为布尔值。

处理值为列表的字典

当你的字典的值是列表时,Pandas 会创建一个 DataFrame,每个字典条目对应一行,列表元素作为单独的列:

person = {
    "name": "John Doe",
    "age": 35,
    "hobbies": ["reading", "hiking", "photography"]
}
 
df = pd.DataFrame(person)

结果 DataFrame 将有一个 "hobbies" 列,每行都有一个值列表。

确保列长度一致

如果字典中的列表长度不同,Pandas 会自动用 NaN 填充缺失的值:

persons = [
    {"name": "John Doe", "hobbies": ["reading", "hiking"]},
    {"name": "Jane Doe", "hobbies": ["painting", "gardening", "cooking"]}
]
 
df = pd.DataFrame(persons)

结果 DataFrame 的 "hobbies" 列将有 3 个元素,对于列表较短的行,使用 NaN 填充。

处理列表长度不等的情况

如果需要确保所有行的列表列长度相同,可以使用 explode() 方法将列表"展开"为单独的行:

persons = [
    {"name": "John Doe", "hobbies": ["reading", "hiking"]},
    {"name": "Jane Doe", "hobbies": ["painting", "gardening", "cooking"]}
]
 
df = pd.DataFrame(persons)
df = df.explode("hobbies")

这将创建一个 DataFrame,每个爱好对应一行,保留了名字和爱好的关联。

包含嵌套字典的字典

当你的字典包含嵌套字典作为值时,Pandas 会在结果 DataFrame 中保留这种结构:

person = {
    "name": "John Doe",
    "age": 35,
    "address": {
        "street": "123 Main St",
        "city": "New York",
.以下是中文翻译版本:
 
"state": "NY"
    }
}
 
df = pd.DataFrame(person)

这个DataFrame将会有一个嵌套的"address"字典的列,可以进一步访问和操作。

扁平化嵌套结构

如果您希望有一个"扁平化"的DataFrame,其中嵌套字典的值作为单独的列,您可以使用pd.json_normalize()函数:

person = {
    "name": "John Doe",
    "age": 35,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    }
}
 
df = pd.json_normalize(person)

这将创建一个DataFrame,其中包含"name", "age", "address.street", "address.city", 和 "address.state"列。

保持层次结构

另外,您可以通过使用pd.DataFrame()函数并设置orient="index"参数来保留嵌套字典的层次结构:

person = {
    "name": "John Doe",
    "age": 35,
    "address": {
        "street": "123 Main St",
        "city": "New York",
        "state": "NY"
    }
}
 
df = pd.DataFrame.from_dict(person, orient="index")

这将创建一个具有层次索引的DataFrame,其中嵌套字典的键表示为多级索引。

处理重复键

如果您的字典有重复键,Pandas将根据您的偏好以不同的方式处理它们。

处理包含重复键的字典

考虑以下包含重复键的字典:

person = {
    "name": "John Doe",
    "age": 35,
    "city": "New York",
    "city": "Los Angeles"
}

当您将此字典转换为DataFrame时,Pandas将保留最后一次出现的重复键:

df = pd.DataFrame(person)

结果DataFrame将有一个"city"列,其值为"Los Angeles"

使用不同策略解决冲突

如果您想以不同的方式处理重复键,可以使用pd.Dat.这里是使用 aFrame() 函数并包含 duplicates 参数的 Markdown 文件的中文翻译:

person = {
    "name": "John Doe",
    "age": 35,
    "city": "New York",
    "city": "Los Angeles"
}
 
# 这将保留第一个重复键的出现,导致 DataFrame 中 "city" 设置为 "New York"。
df = pd.DataFrame([person], duplicates="keep_first")

或者,您可以使用 "keep_last" 保留最后一个出现的重复键,或使用 "raise" 在遇到重复键时引发错误。

保留原始字典结构

如果您想保留原始字典结构,包括重复键,可以使用 pd.DataFrame() 函数并设置 orient="index" 参数:

person = {
    "name": "John Doe",
    "age": 35,
    "city": "New York",
    "city": "Los Angeles"
}
 
# 这将创建一个具有多级索引的 DataFrame,其中重复键表示为单独的行。
df = pd.DataFrame.from_dict(person, orient="index")

合并多个字典

通常,您可能需要处理多个字典并将它们合并为单个 DataFrame。

将字典合并为单个 DataFrame

您可以使用 pd.DataFrame() 函数从字典列表创建 DataFrame:

persons = [
    {"name": "John Doe", "age": 35, "city": "New York"},
    {"name": "Jane Doe", "age": 28, "city": "Los Angeles"},
    {"name": "Bob Smith", "age": 42, "city": "Chicago"}
]
 
df = pd.DataFrame(persons)

这将创建一个包含 "name", "age""city" 列的 DataFrame。

处理具有重叠键的字典

如果字典有重叠键,Pandas 将根据字典在列表中的顺序处理冲突:

persons = [
    {"name": "John Doe", "age": 35, "city": "New York"},
    {"name": "Jane Doe", "age": 28, "city": "Los Angeles"

条件语句

Python 中的条件语句允许您根据条件执行不同的代码块。这是一个 Markdown 文件,包含了 Python 编程语言的一些基本概念和示例代码。以下是中文翻译:

条件语句。最常见的条件语句是 if-elif-else 语句。

age = 25
if age < 18:
    # 如果年龄小于 18 岁,打印"You are a minor."
    print("你是未成年人。")
elif age >= 18 and age < 65:
    # 如果年龄大于等于 18 岁且小于 65 岁,打印"You are an adult."
    print("你是成年人。")
else:
    # 如果以上条件都不满足,打印"You are a senior."
    print("你是老年人。")

在这个例子中,程序会根据年龄检查条件,并打印相应的消息。

循环

Python 中的循环允许你重复执行一个代码块。最常见的两种循环类型是 for 循环和 while 循环。

For 循环

for 循环用于遍历一个序列,如列表、元组或字符串。

fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    # 打印每个水果
    print(fruit)

这将输出:

apple
banana
cherry

While 循环

while 循环用于只要某个条件为真就执行一个代码块。

count = 0
while count < 5:
    # 打印计数器的当前值
    print(count)
    count += 1

这将输出:

0
1
2
3
4

函数

Python 中的函数是可重复使用的代码块,用于执行特定的任务。它们可以接受参数并返回值。

def greet(name):
    # 打印一个问候语
    print(f"你好, {name}!")
 
greet("Alice")

这将输出:

你好, Alice!

你还可以定义带有默认参数和可变长度参数的函数。

def calculate_area(length, width, height=None):
    if height is None:
        # 如果没有提供高度,返回长度乘以宽度
        return length * width
    else:
        # 否则,返回长度乘以宽度乘以高度
        return length * width * height
 
print(calculate_area(5, 10))       # 输出: 50
print(calculate_area(2, 3, 4))     # 输出: 24

模块和包

Python 的内置模块提供了广泛的功能,你也可以创建自己的模块和包。

import math
print(math.pi)  # 输出: 3.141592653589793

你也可以从一个模块中导入特定的函数或属性。

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

包是组织成目录的模块集合。您可以使用点符号从包中导入模块。

import my_package.module1
my_package.module1.my_function()

文件 I/O

Python 提供了内置函数来读取和写入文件。

# 写入文件
with open("example.txt", "w") as file:
    file.write("Hello, world!")
 
# 读取文件
with open("example.txt", "r") as file:
    content = file.read()
    print(content)  # 输出: Hello, world!

with 语句确保在操作完成后文件被正确关闭。

异常处理

Python 的异常处理机制允许您处理代码中的错误和意外情况。

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误: 除数为零")
else:
    print(f"结果: {result}")
finally:
    print("这个块总是会执行。")

这将输出:

错误: 除数为零
这个块总是会执行。

面向对象编程 (OOP)

Python 支持面向对象编程,允许您创建自定义类和对象。

class Dog:
    def __init__(self, name, breed):
        self.name = name
        self.breed = breed
 
    def bark(self):
        print("汪汪!")
 
my_dog = Dog("Buddy", "拉布拉多")
print(my_dog.name)  # 输出: Buddy
my_dog.bark()      # 输出: 汪汪!

在这个例子中,我们定义了一个 Dog 类,它有一个 __init__ 方法来初始化对象的属性,以及一个 bark 方法来让狗狗叫。

结论

在本教程中,我们涵盖了广泛的 Python 概念,包括条件语句、循环、函数、模块和包、文件 I/O、异常处理和面向对象编程。这些是创建强大和多功能 Python 应用程序的基本构建块。当您继续学习和探索 Python 时,请记住要定期练习,尝试不同的技术,并保持好奇心和创造力。以下是该 Markdown 文件的中文翻译:

MoeNagy Dev

欢迎来到 MoeNagy 的开发者空间!

这里是一个充满好奇心和探索精神的地方。我们将一起学习新的编程技术,并寻找资源来深入了解。祝你编码愉快!

# 这是一个示例 Python 代码
def hello_world():
    """
    这个函数打印 "Hello, World!"
    """
    print("Hello, World!")
 
hello_world()
// 这是一个示例 JavaScript 代码
function helloWorld() {
  // 这个函数打印 "Hello, World!"
  console.log("Hello, World!");
}
 
helloWorld();