Python
轻松使用 df.tolist(): 初学者的简明指南

轻松使用 df.tolist(): 初学者的简明指南

MoeNagy Dev

什么是 df.tolist()?

df.tolist() 方法是 pandas DataFrame 的一个方法,它允许您将 DataFrame 或 DataFrame 中的特定列转换为 Python 列表。当您需要以更灵活或高效的方式处理数据,或者需要将 DataFrame 数据与其他 Python 数据结构集成时,这可能会很有用。

何时使用 df.tolist()

您可能会在以下情况下考虑使用 df.tolist() 方法:

  • 当您需要执行更容易使用 Python 列表完成的操作时,例如高级索引、切片或应用自定义函数。
  • 当您需要将数据从 DataFrame 传递给期望 Python 列表作为输入的函数或库时。
  • 当您想将 DataFrame 转换为更节省内存的数据结构时,因为列表有时可能比 DataFrame 更轻量。
  • 当您需要将 DataFrame 转换为更易于序列化或传输的格式时,例如在通过网络发送数据或将其存储在文件中。

将 DataFrame 列转换为列表

要将 DataFrame 的单个列转换为 Python 列表,可以对特定列使用 df.tolist() 方法。

import pandas as pd
 
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
 
# 将单个列转换为列表
column_a_list = df['A'].tolist()
print(column_a_list)
# 输出: [1, 2, 3]

在这个例子中,我们首先创建了一个包含两列 'A''B' 的示例 DataFrame df。然后,我们使用 df['A'].tolist()'A' 列转换为 Python 列表。 使用 df['A'].tolist() 语法将 'A' 列转换为 Python 列表,并将其存储在 column_a_list 变量中。

处理列中的不同数据类型

df.tolist() 方法可以处理包含整数、浮点数、字符串或更复杂数据类型(如列表或字典)的列。生成的列表将反映原始列的数据类型。

# 创建一个包含混合数据类型的 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c'], 'C': [[1, 2], [3, 4], [5, 6]]})
 
# 将每一列转换为列表
column_a_list = df['A'].tolist()
column_b_list = df['B'].tolist()
column_c_list = df['C'].tolist()
 
print(column_a_list)
# 输出: [1, 2, 3]
 
print(column_b_list)
# 输出: ['a', 'b', 'c']
 
print(column_c_list)
# 输出: [[1, 2], [3, 4], [5, 6]]

在这个例子中,DataFrame df 有三列,数据类型分别为整数('A')、字符串('B')和列表('C')。我们使用 df.tolist() 将每一列转换为 Python 列表,生成的列表保留了原始数据类型。

将 DataFrame 转换为列表of列表

如果需要将整个 DataFrame 转换为列表of列表,可以使用 df.tolist() 方法,不需要指定列。

# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
 
# 将 DataFrame 转换为列表of列表
df_as_list = df.tolist()
print(df_as_list)
# 输出: [[1, 4], [2, 5], [3, 6]]

在这个例子中,我们创建了一个包含两列('A''B')的示例 DataFrame df。然后使用 df.tolist() 将整个 DataFrame 转换为列表of列表,其中每个内部列表代表原始 DataFrame 中的一行。

保留原始数据结构

使用 df.tolist() 将 DataFrame 转换为列表of列表时,该方法会保留 DataFrame 的原始数据结构。这意味着行和列的顺序保持不变,个别元素的数据类型也保持不变。

# 创建一个包含混合数据类型的 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'c'], 'C': [[1, 2], [3, 4], [5, 6]]})
 
# 将 DataFrame 转换为列表列表
df_as_list = df.tolist()
print(df_as_list)
# 输出: [[1, 'a', [1, 2]], [2, 'b', [3, 4]], [3, 'c', [5, 6]]]

在这个示例中,结果列表 df_as_list 保留了原始 DataFrame 的行列顺序以及各个元素的数据类型(整数、字符串和列表)。

使用 df.tolist() 的优势

使用 df.tolist() 方法可以提供以下几个优势:

灵活的数据处理

将 DataFrame 转换为列表或列表列表可以为您的数据处理工作提供更大的灵活性。列表提供了广泛的内置方法和函数,如高级索引、切片和应用自定义函数等。

与其他 Python 数据结构的兼容性

列表是 Python 中的基础数据结构,与广泛的其他 Python 数据结构和库兼容。这使您可以轻松地将 DataFrame 中的数据与您的 Python 代码或外部库和工具集成。

在某些场景下的性能提升

在某些情况下,以列表形式处理数据可能比 DataFrame 更高效。这在涉及大量行或列计算的操作中尤其如此,因为列表结构的开销可能低于 DataFrame。

局限性和注意事项

虽然 df.tolist() 方法是一个强大的工具,但也有一些需要注意的局限性:

大 DataFrame 可能导致内存使用问题

将大型 DataFrame 转换为列表或列表列表可能会导致内存使用显著增加,因为列表需要存储所有的数据。

将 DataFrame 转换为列表时可能丢失元数据

将 DataFrame 转换为列表或列表列表时,您可能会丢失与原始 DataFrame 相关的一些元数据,例如列名、数据类型和其他属性。如果您需要保留这些信息以供后续使用,这可能是一个需要考虑的问题。

处理缺失值并适当地处理它们

如果您的 DataFrame 包含缺失值(在 pandas 中用 NaN 表示),df.tolist() 方法将在生成的列表中包含这些值。根据您的使用情况,您可能需要显式地处理这些缺失值,例如用默认值替换它们或从列表中删除它们。

最佳实践和使用案例

以下是使用 df.tolist() 方法的一些最佳实践和常见用例:

特别适合使用 df.tolist() 的场景

  • 与其他 Python 库进行接口交互: 当您需要将 DataFrame 数据传递给一个需要 Python 列表作为输入的函数或库时,df.tolist() 可以是一种方便的转换方式。
  • 执行自定义数据转换: 列表通常比 DataFrame 提供更大的灵活性,可以应用自定义函数或数据操作。
  • 提高某些操作的性能: 在某些情况下,以列表形式处理数据可能比以 DataFrame 形式更高效,特别是对于涉及大量行或列计算的操作。

将 df.tolist() 与其他 DataFrame 方法结合使用

df.tolist() 方法可以与其他 DataFrame 方法结合使用,以实现更复杂的数据转换。例如,您可以使用 df.groupby() 对数据进行分组,然后对每个组应用 df.tolist() 来创建一个列表列表。

# 根据某一列对 DataFrame 进行分组,然后将每个组转换为一个列表。

f lists grouped_df = df.groupby('category') category_lists = [group.tolist() for _, group in grouped_df]

高效和安全使用 df.tolist() 的技巧

  • 考虑内存使用: 在处理大型 DataFrame 时,要注意将数据转换为列表的内存影响。您可能需要以较小的块处理数据,或考虑使用 df.to_numpy() 等替代方法,如果内存使用是一个问题。
  • 处理缺失值: 如果您的 DataFrame 包含缺失值,请确保适当地处理它们,例如用默认值替换或从列表中删除。
  • 保留元数据(如果需要): 如果您需要保留原始 DataFrame 的相关元数据,如列名或数据类型,请考虑使用 df.to_dict()df.to_records() 等替代方法,而不是 df.tolist()

与其他 DataFrame 转换方法的比较

df.tolist() 方法是将 DataFrame 转换为不同数据结构的几种方法之一。以下是与一些其他常见方法的简要比较:

df.values 和 df.to_numpy()

df.valuesdf.to_numpy() 方法都将 DataFrame 转换为 NumPy 数组,这可能比列表of列表更节省内存。但是,这些方法不会保留原始 DataFrame 的列名或数据类型。

df.to_list()

df.to_list() 方法类似于 df.tolist(),但它返回一个 Series 对象列表,而不是列表of列表。如果您需要保留列信息,这可能很有用,但相比于使用列表of列表,可能不太灵活。

这些方法的选择将取决于您的具体使用情况和数据处理工作流的要求。

实际示例和演示

以下是一些使用 df.tolist() 方法的实际示例:

示例 1: 根据值列表过滤 DataFrame

import pandas as pd
 
# 创建一个示例 DataFrame
df = p.
d.DataFrame({'A': [1, 2, 3, 4, 5], 'B': ['a', 'b', 'c', 'd', 'e']})
 
# 将 'A' 列转换为列表
a_list = df['A'].tolist()
 
# 根据 'A' 列的值列表过滤 DataFrame
filtered_df = df[df['A'].isin(a_list[1:4])]
print(filtered_df)
# 输出:
#    A  B
# 1  2  b
# 2  3  c
# 3  4  d

在这个例子中,我们将 DataFrame 的 'A' 列转换为列表,然后使用该列表过滤 DataFrame,创建一个新的 DataFrame,其中包含 'A' 值在列表中的行。

示例 2: 将 DataFrame 数据传递给需要列表的函数

def my_function(data_list):
    # 对列表数据执行某些操作
    processed_data = [x * 2 for x in data_list]
    return processed_data
 
# 创建一个示例 DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
 
# 将 DataFrame 转换为列表列表
df_as_list = df.tolist()
 
# 将列表列表传递给自定义函数
result = my_function(df_as_list)
print(result)
# 输出: [2, 4, 6, 8, 10, 12]

在这个例子中,我们定义了一个自定义函数 my_function,它需要一个数据列表作为输入。我们使用 df.tolist() 将 DataFrame 转换为列表列表,然后将其传递给自定义函数。

示例 3: 将 df.tolist() 与其他 DataFrame 方法结合使用

import pandas as pd
 
# 创建一个示例 DataFrame
df = pd.DataFrame({'category': ['A', 'A', 'B', 'B', 'C', 'C'],
                   'value': [10, 20, 30, 40, 50, 60]})
 
# 根据 category 对 DataFrame 进行分组,然后将每个组转换为列表列表
grouped_df = df.groupby('category')
category_lists = grouped_df.apply(lambda group: group.values.tolist()).tolist() [1]
 
print(category_lists)
 
 

数字

Python 支持三种主要的数字数据类型: 整数 (int)、浮点数 (float) 和复数 (complex)。下面是一个例子:

integer_num = 42
float_num = 3.14
complex_num = 2 + 3j
 
print(integer_num)  # 输出: 42
print(float_num)    # 输出: 3.14
print(complex_num)  # 输出: (2+3j)

您可以对这些数字数据类型执行各种算术运算。

布尔值

布尔值用于表示逻辑值, 要么是 True 要么是 False。它们通常用于条件语句和逻辑运算中。下面是一个例子:

is_sunny = True
is_raining = False
 
print(is_sunny)  # 输出: True
print(is_raining)  # 输出: False

列表

列表是有序的项目集合, 可以包含不同的数据类型。它们使用方括号 ([]) 定义。下面是一个例子:

fruits = ['apple', 'banana', 'cherry']
numbers = [1, 2, 3, 4, 5]
mixed_list = [1, 'hello', True, 3.14]
 
print(fruits)  # 输出: ['apple', 'banana', 'cherry']
print(numbers)  # 输出: [1, 2, 3, 4, 5]
print(mixed_list)  # 输出: [1, 'hello', True, 3.14]

您可以使用索引和切片来访问和修改列表中的元素。

元组

元组类似于列表, 但它们是不可变的, 这意味着它们的元素在创建后不能被更改。元组使用括号 (()) 定义。下面是一个例子:

point = (2, 3)
person = ('John', 30, 'Engineer')
 
print(point)  # 输出: (2, 3)
print(person)  # 输出: ('John', 30, 'Engineer')

元组通常用于表示具有固定数量元素的数据结构。

字典

字典是无序的键值对集合。它们使用花括号 ({}) 定义。下面是一个例子:

person = {
    'name': 'John',
    'age': 30,
    'occupation': 'Engineer'
}
 
print(person)  # 输出: {'name': 'John', 'age': 30, 'occupation': 'Engineer'}
print(person['name'])  # 输出: John
```字典是用于通过有意义的键来存储和检索数据的有用工具。
 
### 集合
集合是无序的唯一元素集合。它们使用花括号 (`{}`) 定义,与字典类似。下面是一个例子:
 
```python
colors = {'red', 'green', 'blue'}
numbers = {1, 2, 3, 4, 5}
 
print(colors)  # 输出: {'red', 'green', 'blue'}
print(numbers)  # 输出: {1, 2, 3, 4, 5}

集合对于执行诸如并集、交集和差集等操作非常有用。

运算符和表达式

算术运算符

Python 支持以下算术运算符:

  • 加法 (+)
  • 减法 (-)
  • 乘法 (*)
  • 除法 (/)
  • 整除 (//)
  • 取模 (%)
  • 幂运算 (**)

下面是一个例子:

a = 10
b = 3
 
print(a + b)  # 输出: 13
print(a - b)  # 输出: 7
print(a * b)  # 输出: 30
print(a / b)  # 输出: 3.3333333333333335
print(a // b)  # 输出: 3
print(a % b)  # 输出: 1
print(a ** b)  # 输出: 1000

比较运算符

Python 支持以下比较运算符:

  • 等于 (==)
  • 不等于 (!=)
  • 小于 (<)
  • 小于或等于 (<=)
  • 大于 (>)
  • 大于或等于 (>=)

下面是一个例子:

a = 10
b = 20
 
print(a == b)  # 输出: False
print(a != b)  # 输出: True
print(a < b)  # 输出: True
print(a <= b)  # 输出: True
print(a > b)  # 输出: False
print(a >= b)  # 输出: False

逻辑运算符

Python 支持以下逻辑运算符:

  • 与 (and)
  • 或 (or)
  • 非 (not)

下面是一个例子:

a = True
b = False
 
print(a and b)  # 输出: False
print(a or b)  # 输出: True
print(not a)  # 输出: False

位运算符

Python 还支持位运算符,它们对整数的个别位进行操作。位运算符包括:

  • 与 (&)
  • 或 (|)
  • 异或 (^)
  • 非 (~)
  • 左移 (<<)
  • 右移 (>>)

下面是一个例子:

a = 0b1010  # 二进制 10
b = 0b1100  # 二进制 12
```这是一个 Python 代码示例,包含了一些基本的位运算操作和控制流语句、函数以及模块的使用。以下是中文翻译:
 
```python
print(a & b)  # 输出: 8 (二进制 1000)
print(a | b)  # 输出: 14 (二进制 1110)
print(a ^ b)  # 输出: 6 (二进制 0110)
print(~a)  # 输出: -11 (二进制 -1011)
print(a << 1)  # 输出: 20 (二进制 10100)
print(a >> 1)  # 输出: 5 (二进制 101)

控制流

条件语句

Python 提供以下条件语句:

  • if
  • elif (else if)
  • else

示例:

age = 18
 
if age < 18:
    print("你是未成年人。")
elif age < 21:
    print("你是青年。")
else:
    print("你是成年人。")

循环

Python 支持两种主要类型的循环:

  • for 循环
  • while 循环

for 循环示例:

fruits = ['苹果', '香蕉', '樱桃']
 
for fruit in fruits:
    print(fruit)

while 循环示例:

count = 0
 
while count < 5:
    print(count)
    count += 1

Break 和 Continue 语句

break 语句用于提前退出循环,而 continue 语句用于跳过当前迭代,转到下一次迭代。

示例:

for i in range(10):
    if i == 5:
        break
    if i % 2 == 0:
        continue
    print(i)

输出:

1
3

函数

Python 中使用 def 关键字定义函数。示例:

def greet(name):
    """
    打印带有给定名字的问候语。
    """
    print(f"你好, {name}!")
 
greet("Alice")  # 输出: 你好, Alice!

函数也可以返回值:

def add_numbers(a, b):
    return a + b
 
result = add_numbers(5, 3)
print(result)  # 输出: 8

函数可以有默认参数值,并使用 *args**kwargs 接受可变数量的参数。

模块和包

Python 的标准库提供了大量内置模块,如 mathosdatetime。你可以导入这些模块并使用它们的函数和变量。

示例:

import math
 
print(math.pi)  # 输出: 3.141592653589793
```导入数学模块
 
print(math.pi)  # 输出: 3.141592653589793
print(math.sqrt(16))  # 输出: 4.0
 
您也可以从模块中导入特定的函数或变量:
 
```python
from math import pi, sqrt
 
print(pi)  # 输出: 3.141592653589793
print(sqrt(16))  # 输出: 4.0

Python 还允许您创建自己的模块和包。模块是单个 Python 文件,而包是模块的集合。

结论

在本教程中,您已经学习了 Python 的基本概念,包括变量和数据类型、运算符和表达式、控制流、函数以及模块和包。这些是 Python 编程的基础,掌握这些概念将帮助您编写更复杂和强大的 Python 应用程序。

请记住,编程是一个持续学习的过程,提高的最佳方式是编写代码并解决问题。继续探索 Python 生态系统,尝试新的库和框架,不要害怕实验和从错误中学习。

祝您编码愉快!

MoeNagy Dev.