Python
轻松将数据框转换为列表:简明指南

轻松将数据框转换为列表:简明指南

MoeNagy Dev

将数据框转换为列表:全面指南

将数据框转换为列表:基础知识

了解数据框的结构和目的

数据框是 Python 数据科学生态系统(特别是 Pandas 库)中的一种基础数据结构。它们是二维的表格数据结构,可以存储各种数据类型的数据,类似于电子表格。数据框广泛用于数据操作、分析和处理任务。

认识到将数据框转换为列表的需求

虽然数据框提供了一种强大和灵活的方式来处理数据,但在某些情况下,您可能需要将数据转换为更基本的数据结构,如列表。这种转换可能在以下情况下有用:

  • 将数据框数据与其他 Python 库或函数集成,这些库或函数需要列表输入
  • 执行某些数据转换或分析任务,这些任务在使用列表时更加高效
  • 通过将数据框转换为更紧凑的列表表示来减少大型数据集的内存占用
  • 在与外部系统或 API 进行数据传输或序列化时,方便数据处理

探索这种转换的优势和使用场景

将数据框转换为列表可以提供几个好处,具体取决于您的使用场景:

  • 灵活性:列表是 Python 中的一种基础数据结构,提供了广泛的内置方法和函数来进行操作和处理。
  • 性能:在某些情况下,使用列表可能比直接使用数据框更高效。特别适用于不需要完整数据框功能的操作。
  • 互操作性:将数据框转换为列表可以实现与其他期望基于列表的输入的 Python 库、工具和工作流程的无缝集成。
  • 内存优化:对于大型数据集,将数据框转换为列表可以减少内存占用,允许您更有效地处理数据,特别是在内存资源有限的系统上。

从数据框中提取数据

访问单个列作为列表

要从数据框中提取单个列并将其转换为列表,可以使用以下方法:

import pandas as pd
 
# 创建一个示例数据框
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
 
# 将单个列转换为列表
col_a_list = df['A'].tolist()
 
# 将多个列转换为列表
col_b_list = df['B'].tolist()
col_c_list = df['C'].tolist()

提取行作为列表

要从数据框中提取行并将其转换为列表,可以使用 to_list() 方法或 values 属性:

# 将单个行转换为列表
row_1_list = df.iloc[0].tolist()
 
# 将多个行转换为列表
all_rows_list = df.to_numpy().tolist()

处理多维数据框

如果您的数据框有多级列或行索引,可以相应地处理转换为列表:

# 创建一个多级列数据框
df_multi = pd.DataFrame([[1, 2, 3], [4, 5, 6], [7, 8, 9]],
                        columns=pd.MultiIndex.from_product([['A', 'B'], ['X', 'Y']]))
 
# 将多级列数据框转换为列表列表
data_list = df_multi.to_numpy().tolist()

应用 Pandas 函数进行数据框到列表的转换

使用 to_list() 方法

to_list() 方法是将数据框列或行转换为列表的便捷方式:

# 将单个列转换为列表
col_a_list = df['A'].to_list()
 
# 将单个行转换为列表
row_1_list = df.iloc[0].to_list()

将行转换为列表 row_1_list = df.iloc[0].to_list()

利用 values 属性

数据框的 values 属性返回数据框的 NumPy 数组表示。您可以使用 tolist() 方法将此数组转换为列表:

# 将数据框转换为列表列表
data_list = df.values.tolist()

结合 tolist()to_numpy()

为了更好地控制转换过程,您可以结合使用 tolist()to_numpy() 方法:

# 将数据框转换为列表列表
data_list = df.to_numpy().tolist()
 
# 将特定列转换为列表
col_a_list = df['A'].to_numpy().tolist()

高效的数据框切片和子集

选择特定列进行转换

要仅将数据框的特定列转换为列表,可以使用列选择:

# 将选定的列转换为列表
cols_to_convert = ['A', 'C']
col_a_list = df[cols_to_convert[0]].tolist()
col_c_list = df[cols_to_convert[1]].tolist()

根据条件过滤行

您还可以根据特定条件过滤数据框,然后将选定的行转换为列表:

# 过滤行并转换为列表
filtered_df = df[df['A'] > 1]
filtered_rows_list = filtered_df.to_numpy().tolist()

结合列和行选择

要根据列和行选择转换数据框的子集,可以使用多种技术的组合:

# 选择特定的列和行,然后转换为列表
cols_to_convert = ['A', 'C']
filtered_df = df[(df['A'] > 1) & (df['B'] < 6)]
filtered_data_list = filtered_df[cols_to_convert].to_numpy().tolist()

处理转换过程中的缺失数据

处理 NaN (非数字) 值

在将数据框转换为列表时,可能会遇到 NaN (非数字) 值,这表示缺失数据。默认情况下,这些值将在转换过程中保留:

# 创建一个包含 NaN 值的数据框
```缺失值
 
df_with_nan = pd.DataFrame({'A': [1, 2, None, 4], 'B': [4, 5, 6, None]})
 
# 将数据框转换为列表列表,保留NaN值
data_list_with_nan = df_with_nan.to_numpy().tolist()
 
### 用适当的值替换缺失数据
 
如果您想在转换过程中用特定的值替换 `NaN` 值,可以使用 `fillna()` 方法:
 
```python
# 在转换为列表之前,用0替换NaN值
df_with_nan_filled = df_with_nan.fillna(0)
data_list_with_filled_nan = df_with_nan_filled.to_numpy().tolist()

在转换过程中保持数据完整性

将数据框转换为列表时,确保数据完整性很重要。这包括保留数据类型和处理数据框中的任何复杂数据结构。

保持数据类型和结构

在转换过程中保留数据类型

数据框可以存储各种类型的数据,如整数、浮点数、字符串等。在将数据框转换为列表时,您可以确保数据类型得到保留:

# 创建一个包含混合数据类型的数据框
df_mixed_types = pd.DataFrame({'A': [1, 2.5, 'three'], 'B': [4, 5, 6]})
 
# 将数据框转换为列表列表,保留数据类型
data_list_with_types = df_mixed_types.to_numpy().tolist()

处理数据框中的复杂数据结构

数据框还可以包含更复杂的数据结构,如嵌套字典或列表。在将这些数据框转换为列表时,您可以保留嵌套结构:

# 创建一个包含嵌套数据结构的数据框
df_nested = pd.DataFrame({'A': [{'x': 1, 'y': 2}, {'x': 3, 'y': 4}], 'B': [[1, 2], [3, 4]]})
 
# 将数据框转换为列表列表,保留嵌套结构
data_list_with_nested = df_nested.to_numpy().tolist()

将嵌套数据框转换为嵌套列表

如果您的数据框包含嵌套数据框,您可以将整个结构转换为嵌套列表。

将数据帧转换为嵌套列表表示

# 创建一个包含嵌套数据帧的数据帧
df_with_nested_df = pd.DataFrame({'A': [1, 2], 'B': [pd.DataFrame({'X': [3, 4], 'Y': [5, 6]}),
                                        pd.DataFrame({'X': [7, 8], 'Y': [9, 10]})]})
 
# 将包含嵌套数据帧的数据帧转换为列表列表
data_list_with_nested_df = df_with_nested_df.to_numpy().tolist()

优化大型数据帧的性能

高效内存管理的策略

在处理大型数据帧时,需要考虑转换过程中的内存使用情况。您可以采用分块迭代或使用生成器等策略来优化内存消耗:

# 分块转换大型数据帧为列表
chunk_size = 1000
data_list = []
for i in range(0, len(df), chunk_size):
    data_list.extend(df.iloc[i:i+chunk_size].to_numpy().tolist())

并行化转换过程

为了进一步提高性能,您可以利用并行化技术以并发方式将数据帧转换为列表:

import multiprocessing as mp
 
# 定义一个函数,用于转换数据帧的一个块
def convert_chunk(df_chunk):
    return df_chunk.to_numpy().tolist()
 
# 并行转换数据帧为列表
num_cores = mp.cpu_count()
with mp.Pool(processes=num_cores) as pool:
    data_list = sum(pool.map(convert_chunk, [df.iloc[i:i+chunk_size] for i in range(0, len(df), chunk_size)]), [])

利用库和工具实现可扩展性

根据您的具体使用场景和数据帧的大小,您可能会发现使用其他库或工具可以为转换过程提供更好的性能。例如,您可以探索使用 dask 库,它提供了一种分布式和并行化的方法来处理大型数据集。

使用数据结构

列表

列表是 Python 中最versatile的数据结构。这是一个 Python 文件。列表可以存储不同数据类型的元素,并且可以被修改、切片和迭代。下面是一个创建和操作列表的例子:

# 创建一个列表
fruits = ['apple', 'banana', 'cherry']
 
# 访问元素
print(fruits[0])  # 输出: 'apple'
print(fruits[-1])  # 输出: 'cherry'
 
# 修改元素
fruits[1] = 'pear'
print(fruits)  # 输出: ['apple', 'pear', 'cherry']
 
# 添加元素
fruits.append('orange')
print(fruits)  # 输出: ['apple', 'pear', 'cherry', 'orange']
 
# 删除元素
fruits.remove('pear')
print(fruits)  # 输出: ['apple', 'cherry', 'orange']
 
# 切片
print(fruits[1:3])  # 输出: ['cherry', 'orange']

元组

元组与列表类似,但它们是不可变的,意味着它们的元素在创建后不能被修改。元组通常用于表示一组固定的值,例如二维空间中点的坐标。下面是一个例子:

# 创建一个元组
point = (2, 3)
print(point)  # 输出: (2, 3)
 
# 访问元素
print(point[0])  # 输出: 2
print(point[1])  # 输出: 3
 
# 尝试修改元组元素
# point[0] = 4  # TypeError: 'tuple' object does not support item assignment

字典

字典是无序的键值对集合。它们用于快速存储和检索数据,并且常用于表示复杂的数据结构。下面是一个例子:

# 创建一个字典
person = {
    'name': 'John Doe',
    'age': 30,
    'occupation': 'Software Engineer'
}
 
# 访问值
print(person['name'])  # 输出: 'John Doe'
print(person['age'])  # 输出: 30
 
# 添加新的键值对
person['email'] = 'john.doe@example.com'
print(person)  # 输出: {'name': 'John Doe', 'age': 30, 'occupation': 'Software Engineer', 'email': 'john.doe@example.com'}
 
# 删除键值对
del person['occupation']
print(person)  # 输出: {'name': 'John Doe', 'age': 30, 'email': 'john.doe@example.com'}

##.# 集合

集合是无序的唯一元素集合。它们对于执行集合操作(如并集、交集和差集)很有用。下面是一个例子:

# 创建集合
colors = {'red', 'green', 'blue'}
print(colors)  # 输出: {'blue', 'green', 'red'}
 
# 添加元素
colors.add('yellow')
print(colors)  # 输出: {'blue', 'green', 'red', 'yellow'}
 
# 删除元素
colors.remove('green')
print(colors)  # 输出: {'blue', 'red', 'yellow'}
 
# 集合操作
colors2 = {'orange', 'yellow', 'purple'}
print(colors.union(colors2))  # 输出: {'blue', 'orange', 'purple', 'red', 'yellow'}
print(colors.intersection(colors2))  # 输出: {'yellow'}
print(colors.difference(colors2))  # 输出: {'blue', 'red'}

控制流

条件语句

Python中的条件语句用于根据某些条件做出决策。最常见的条件语句是if-elif-else语句。下面是一个例子:

age = 25
if age < 18:
    print("你是未成年人。")
elif age < 65:
    print("你是成年人。")
else:
    print("你是老年人。")

循环

Python中的循环用于重复执行一个代码块。最常见的循环类型是forwhile循环。下面是每种循环的示例:

# For循环
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# While循环
count = 0
while count < 5:
    print(count)
    count += 1

函数

Python中的函数是执行特定任务的可重用代码块。它们可以接受参数并返回值。下面是一个例子:

def greet(name):
    """
    向给定名称的人问候。
    """
    print(f"你好, {name}!")
 
greet("Alice")  # 输出: 你好, Alice!

模块和包

Python的标准库提供了大量可在程序中使用的模块。您也可以创建自己的模块和包来组织代码。下面是使用的示例。math 模块:

import math
 
# 使用 math 模块中的函数
print(math.pi)  # 输出: 3.141592653589793
print(math.sqrt(16))  # 输出: 4.0

文件 I/O

Python 提供了内置的函数来读取和写入文件。以下是一个读取和写入文件的示例:

# 写入文件
with open('example.txt', 'w') as file:
    file.write("这是一个示例文本文件。")
 
# 读取文件
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # 输出: 这是一个示例文本文件。

结论

在本教程中,您已经学习了 Python 中各种数据结构,包括列表、元组、字典和集合。您还学习了控制流、函数、模块和包以及文件 I/O。这些概念是编写有效和高效的 Python 程序的基础。有了这些知识,您现在可以开始构建更复杂的应用程序,并使用 Python 解决现实世界的问题。

MoeNagy Dev.