假设我有这样的代码:
import pandas as pd
mylist = [item for item in range(100000)]
df = pd.DataFrame()
df["col1"] = mylist
中的数据在赋值给
mylist
时是否被复制了?如果是这样,有没有办法避免这种复制?
df["col1"]
编辑:在这种情况下,我的列表是字符串列表。我从这些答案中得到的一件事是,如果我创建这些字符串的 numpy 数组,我调用
时不会发生数据重复?
df["col1"] = mynparray
?
在提供的代码中,将
mylist
分配给
df["col1"]
时,
会
发生数据复制。这是因为 Pandas DataFrames 被设计为保存数据的自身副本以实现数据完整性和可预测行为。
但是,可以使用多种方法避免这种复制:
1. 使用
pd.Series
构造函数
可以使用
pd.Series
构造函数直接从列表创建 Pandas Series,然后将该 Series 分配给 DataFrame 列。这比创建空 DataFrame 然后分配列更有效。
import pandas as pd
mylist = [item for item in range(100000)]
df = pd.DataFrame({"col1": pd.Series(mylist, copy=False)})
使用
copy=False
参数指示 Pandas 在可能的情况下避免复制数据。但是,如果基础数据不是兼容的 dtype(例如,Python 字符串列表),Pandas 可能仍会为了类型一致性创建副本。
2. 使用 NumPy 数组和
share()
如果处理的是字符串以外的数字数据,则可以创建一个 NumPy 数组并将
share()
方法用于其基础数据缓冲区。这将创建一个共享相同底层数据的视图,从而避免复制。
import pandas as pd
import numpy as np
mynparray = np.arange(100000)
df = pd.DataFrame({"col1": mynparray.share(name="col1")})
这将创建一个 DataFrame,其中“col1”列与 NumPy 数组共享数据缓冲区,从而防止复制。
3. 使用
from_records()
如果的数据已经是列表列表或 NumPy 数组,则可以使用
from_records()
方法创建一个 DataFrame 并将
copy=False
传递给它。
import pandas as pd
data = [[item] for item in range(100000)]
df = pd.DataFrame.from_records(data, columns=["col1"], copy=False)
这将创建一个 DataFrame,该 DataFrame 使用提供的列表作为其数据,而不进行复制。
对于的字符串列表情况:
创建这些字符串的 NumPy 数组并将该数组分配给
df["col1"]
不会复制字符串数据本身
。这是因为 NumPy 数组可以保存对对象的引用,例如字符串。但是,Pandas DataFrame 仍将存储对 NumPy 数组的引用,这意味着数据本身存在于 DataFrame 之外。
重要的是要注意,避免复制并不总是最好的选择。如果需要修改原始列表或 NumPy 数组,同时保持 DataFrame 中数据的完整性,则允许 DataFrame 创建数据副本会更安全。
标签:python,list,pandas From: 51329934