数据框视图或副本有啥好处

Posted

技术标签:

【中文标题】数据框视图或副本有啥好处【英文标题】:What is the benefit of a dataframe view or copy数据框视图或副本有什么好处 【发布时间】:2017-01-20 05:15:09 【问题描述】:

我看到很多关于臭名昭著的SettingWithCopy 警告的问题。我什至敢于回答其中的几个。最近,我正在整理一个涉及该主题的答案,我想展示数据框视图的好处。我未能提供具体的演示来说明为什么创建数据框视图或生成 SettingWithCopy

的任何东西是个好主意

考虑df

df = pd.DataFrame([[1, 2], [3, 4]], list('ab'), list('AB'))
df

   A  B
x  1  2
y  3  4

dfvdf 的副本

dfv = df[['A']]

print(dfv.is_copy)

<weakref at 0000000010916E08; to 'DataFrame' at 000000000EBF95C0>

print(bool(dfv.is_copy))

True

我可以生成SettingWithCopy

dfv.iloc[0, 0] = 0


但是,dfv 已更改

print(dfv)

   A
a  0
b  3

df没有

print(df)

   A  B
x  1  2
y  3  4

dfv 仍然是副本

print(bool(dfv.is_copy))

True

如果我改变df

df.iloc[0, 0] = 7
print(df)

   A  B
x  7  2
y  3  4

但是dfv 没有改变。但是,我可以从dfv 引用df

print(dfv.is_copy())

   A  B
x  7  2
y  3  4

问题

如果dfv 维护它自己的数据(意思是,它实际上并没有节省内存)并且尽管有警告,它仍然通过赋值操作分配值,那么我们为什么还要费心保存引用并生成SettingWithCopyWarning ?

什么是有形的好处?

【问题讨论】:

有趣的是 print(dfv._is_view) 在查看后打印 False 并在 iloc 分配后更改为 True,这是违反直觉的,并且是 IMO 的错误 【参考方案1】:

对此已有很多讨论,例如,请参阅here,包括尝试的 PR。还值得注意的是,真正的视图写入时复制被视为“pandas 2.0”重构的一部分,请参阅here。

在您的示例中维护引用的原因特别是因为它不是视图,因此如果有人尝试这样做,他们会收到警告。

df[['A']].iloc[0, 0] = 1

编辑:

就“为什么要使用视图”而言,这是出于性能/内存的原因。考虑一下,基本索引(选择一列),因为这个操作需要一个视图,它几乎是瞬时的。

df = pd.DataFrame(np.random.randn(1000000, 2), columns=['a','b'])

%timeit df['a']
100000 loops, best of 3: 2.13 µs per loop

而获取副本的成本不菲。

%timeit df['a'].copy()
100 loops, best of 3: 4.28 ms per loop

这种性能成本会出现在许多操作中,例如将两个 Series 相加。

%timeit df['a'] + df['b']
100 loops, best of 3: 4.31 ms per loop

%timeit df['a'].copy() + df['b'].copy()
100 loops, best of 3: 13.3 ms per loop

【讨论】:

实际上,我还会展示选择视图和复制视图的性能影响(用于简单选择) @Jeff,添加了一个基本示例

以上是关于数据框视图或副本有啥好处的主要内容,如果未能解决你的问题,请参考以下文章

识别另一个 pandas DataFrame 的视图或副本

Pandas 使用啥规则来生成视图和副本?

使用 Python pandas 数据框时返回副本与视图警告

在 knockout.js 视图模型中使用 `var self = this` 有啥好处 [重复]

Numpy | 20 副本和视图

为啥MYSQL很少人用视图,MYSQL的视图和MSSQL的视图有啥本质区别。