我只是在玩熊猫,试图修改列的值。
我的初始数据帧是:
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