gpt4 book ai didi

python - 数据框 View 或副本有什么好处

转载 作者:行者123 更新时间:2023-11-30 22:50:14 26 4
gpt4 key购买 nike

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

的东西是个好主意

考虑df

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

A B
x 1 2
y 3 4

dfv,它是df

的副本
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

enter image description here

<小时/>

但是,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 根本吗?

实际的好处是什么?

最佳答案

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

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

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

编辑:

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

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

关于python - 数据框 View 或副本有什么好处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455863/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com