pandas 为什么此迭代不能正确更改全局DF变量

wmomyfyw  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个类似的代码从下面的一个为我的工作,我不知道为什么它不正确地改变全局DF变量的嵌套数组的循环。

>> df1 = pd.DataFrame({
>>  'x': [1,2,3,4,5],
>>  'y': ['a', 'b', 'c', 'd', 'e']
>> })
>> df2 = df1

>> for array in [[df1, 9], [df2, 'z']]:
>>  array[0]['x'] = array[1]
>>  array[0]['y'] = array[1]
>>  print(array[0])

   x  y
0  9  9
1  9  9
2  9  9
3  9  9
4  9  9
   x  y
0  z  z
1  z  z
2  z  z
3  z  z
4  z  z

>> print(df1)
   x  y
0  z  z
1  z  z
2  z  z
3  z  z
4  z  z
>> print(df2)
   x  y
0  z  z
1  z  z
2  z  z
3  z  z
4  z  z

所以在第一次迭代中我们看到了正确的变化,df1的两列都是9,df2的两列都是z,但是当我们检查全局变量时,我们看到所有的变量都是z,甚至df1,我不知道为什么。

lhcgjxsq

lhcgjxsq1#

当Python中的对象是可变的时,您通过引用而不是通过值来复制。intstr是不可变的对象类型,但listdictpandas.DataFrame是可变的。请参阅以下示例了解intlist的含义:

a = 1
b = a
b += 1
print(a)
# >> 1

x = [1,2,3]
y = x
y.append(4)
print(x)
# >> [1, 2, 3, 4]

因此,当你赋值df2时,你赋值给了df1所引用的对象,也就是说,当你改变df2时,你也改变了df1所引用的对象,因为它实际上是同一个对象,你可以使用内置的id()函数来检查这一点:

df1 = pd.DataFrame({'x': [1,2,3,4,5],  'y': ['a', 'b', 'c', 'd', 'e']})
df2 = df1
print(id(df1), id(df2))
# >> 4695746416 4695746416

要获得同一 Dataframe 的拷贝,您需要使用copy()

df1 = pd.DataFrame({'x': [1,2,3,4,5],  'y': ['a', 'b', 'c', 'd', 'e']})
df2 = df1.copy()
print(id(df1), id(df2))
# >> 4695749728 4695742816

相关问题