熊猫分配意外行为



我只是在玩熊猫,试图修改列的值。

我的初始数据帧是:

df = pd.DataFrame(
dict(x=[1, 2, 3, 4, 5, 6, 7], y=[10, 11, 15, 14, 14, 25, 25)
)
df.index = list('abcdefg')

输出:

>>> df
x   y
a  1  10
b  2  11
c  3  15
d  4  14
e  5  14
f  6  25
g  7  25

假设我想修改x列的第一个元素。我知道:

df.loc['a', 'x'] = 100

输出:

>>> df.loc['a', 'x'] = 100
>>> df
x   y
a  100  10
b    2  11
c    3  15
d    4  14
e    5  14
f    6  25
g    7  25

我不能理解的是为什么会出现以下情况:

>>> j = df['x']
>>> j['a'] = 200
>>> df
x   y
a  200  10
b    2  11
c    3  15
d    4  14
e    5  14
f    6  25
g    7  25

还修改了CCD_ 4中CCD_ 3列的第一个元素。此外:

>>> df.loc['a', 'x'] is j['a']
False

这意味着它们不指向同一个对象。发生了什么事?

您没有执行正确的测试。你应该测试一下:

j is df['x']

输出:True

CCD_ 6和CCD_。

False由不包含python对象的底层numpy数组来解释。对象在切片过程中生成:

import numpy as np
a = np.array([1, 2, 3])
a[0] is a[0]

输出:False

这就是为什么我们在这里需要copy

j = df['x'].copy()

请注意,添加副本后,id号与不同

id(df['x'])
Out[612]: 140536670316496
id(df['x'].copy())
Out[613]: 140536673228496

因为j = df['x']只将df['x']的对象引用分配给j。通过j修改的任何内容都将影响内存中与df['x']后面的对象相同的对象。

如果您想复制df['x']后面的对象值,将其存储到j中,并独立于df进行修改,则需要使用.copy()方法作为:

j = df['x'].copy()

请访问了解更多信息https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.copy.html

最新更新