Pandas:为什么Pandas操作不是就地执行的

Pandas:为什么Pandas操作不是就地执行的

在本文中,我们将介绍为什么Pandas操作默认情况下不是就地执行的。Pandas是Python中使用最广泛的数据分析库之一。它提供了很多优雅的API,可以使数据操作更加容易和快速。然而,与许多其他Python库不同的是,Pandas默认情况下不会就地修改源数据。相反,许多操作会返回新的数据对象,需要分配到新的变量才能访问结果。那么,为什么Pandas会选择这种非就地操作的方式,这样做有什么好处和缺点?

阅读更多:Pandas 教程

非就地操作的好处

Pandas的非就地操作是它的一个特色,它带来了很多好处,这里我们列出一些:

1. 保留源数据

Pandas的不就地操作可以确保源数据保持不变。这可以被认为是数据操作中最重要的特征之一。由于Pandas处理大量的数据,一旦数据被误修改,就很难恢复。因此,Pandas的非就地操作可以确保数据不会被误修改。

2. 可以进行撤销和重做操作

Pandas的非就地操作可以轻松地实现撤销和重做操作。在进行数据操作时,我们可能会犯错误,使得我们需要撤销之前的更改。如果所有的操作都是就地执行的,则撤销操作将变得相当困难。由于Pandas不就地执行操作,我们可以轻松地撤销操作并回滚到之前的状态。此外,我们还可以像操作其他文本编辑器中的操作一样,实现重做操作。

3. 减少内存使用

除了保留源数据和可撤销操作之外,Pandas的非就地操作还可以减少内存使用。在许多情况下,操作会生成一个新的数据对象,而这个新的数据对象可能有时候比原始数据对象要小。此外,Python使用垃圾回收机制来自动清理不再使用的内存。例如,假设我们从一个CSV文件中读取100 MB的数据帧,如果我们直接进行就地操作,那么在劫持阶段,Pandas将在内存上分配100 MB的内存空间。然而,在进行操作之后,只需要保留操作后的结果,释放原始数据的存储空间。通过这种方式,我们可以节省大量的内存。

示例

我们来看看一些例子来更好地理解这些好处。在这里,我们将尝试使用一些简单的代码来解释:

import pandas as pd

# 创建一个数据帧
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 附加一列
df['C'] = df['A'] + df['B']
print(df)

# 输出:
#    A  B  C
# 0  1  4  5
# 1  2  5  7
# 2  3  6  9

在这个例子中,我们首先创建了一个数据帧,有列‘A’和列‘B’。我们随后使用非就地操作将列‘A’和‘B’相加,并将结果分配给新的列‘C’。这个新的列‘C’不会影响原始数据帧,所以我们在执行原始数据帧时不会看到任何变化。如果我们使用就地操作,似乎我们需要做更多的工作:

import pandas as pd

# 创建一个数据帧
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})

# 在列'B'上就地增加10
df['B'] += 10

# 打印数据帧
print(df)

# 输出:
#    A   B
# 0  1  14
# 1  2  15
# 2  3  16

在这个例子中,我们创建了一个数据帧,并在列‘B’上进行了就地操作,增加了所有值的10。请注意,在此操作之后,原始数据帧已被修改,而且我们无法撤销这些更改。

非就地操作的缺点

除了好处之外,Pandas的非就地操作也带来了一些缺点:

1. 耗时

Pandas的非就地操作可能需要更长的时间来完成,因为它需要为新的数据对象分配内存,并将源数据复制到新对象中。这种非就地操作会占用更多的CPU和内存资源,从而导致运行速度较慢。

2. 需要更多的存储空间

由于Pandas的非就地操作需要为新的数据对象分配内存,因此这种操作需要更多的存储空间。在执行一系列操作时,可能需要保存中间结果,并且可能会使用更多的存储空间。

示例

我们再来看一个示例来说明这些缺点。在这个例子中,我们将使用2个版本的绘图函数:一个是就地实现,一个是非就地实现。

import pandas as pd
import matplotlib.pyplot as plt

# 创建一个数据帧
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})

# 就地实现的绘图函数
def plot_inplace(df):
    plt.plot(df['x'], df['y'])
    plt.show()

# 非就地实现的绘图函数
def plot_non_inplace(df):
    df.plot(x='x', y='y')
    plt.show()

# 测试就地实现
plot_inplace(df)

# 测试非就地实现
plot_non_inplace(df)

在这个示例中,我们使用了一个名为Matplotlib的库,用于绘制图形。我们先定义了两个函数:一个是就地实现,使用plt.plot直接在图像上进行修改。另一个是非就地实现,使用df.plot生成一个新的数据对象,并使用该对象进行绘图。在这个例子中,由于就地实现需要在源数据上进行更改,所以我们需要确保不会再次使用源数据;因此,我们先使用一个版本,然后测试另一个版本。请注意,在非就地实现的图中,我们使用了df.plot函数,它会返回一个新的数据对象,并占用更多的内存。

总结

Pandas使用非就地操作提供了许多好处和缺点。尽管这些操作可能消耗更多的内存和CPU资源,但它们确实是数据操作中最重要的特征之一。Pandas非就地操作可以确保源数据保持不变,并且可以轻松地实现撤销和重做操作。此外,非就地操作还可以减少内存使用,并且使操作更加安全。因此,Pandas的非就地操作在大多数情况下都是首选,尽管在某些情况下也可以使用特殊的就地操作。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程