分配给数据帧的转置时为什么丢失数据?

可以说我有一个像

df = pd.DataFrame({'A':[1,2,3,4],'B':[1,3,4,7]})
   A  B
0  1  1
1  2  3
2  3  4
3  4  7

当我分配一些数据以转置数据帧时,没有错误,即

df.T['C'] = 3

运行此命令后,数据框没有任何变化.

但是问题是数据存储在哪里?为什么没有给出任何错误?我期待这种分配或输出这样的错误

   A  B
0  1  1
1  2  3
2  3  4
3  4  7
C  3  3

当我执行df.T [‘C’] = 3时都没有发生

编辑:正如@Zero提到的,我们可能要做

df = df.T.assign(C=3).T # Which is like df.loc['C',:] = 3

解决方法:

df.T是另一个对象.您所做的更改不会反映在原始df中.它在哪里?由于没有指向它的变量,因此它要么已被垃圾收集器收集,要么正在等待收集.您无法访问它.

您可以做的是创建一个新变量

transposed = df.T

transposed['C'] = 3

transposed
Out: 
   0  1  2  3  C
A  1  2  3  4  3
B  1  3  4  7  3   

当您调用任何返回新DataFrame的方法时,也会发生同样的事情. df.drop(0)[‘C’] = 2,df.reset_index()[‘C’] = 3或df.drop_duplicates()[‘C’] =3.原始DataFrame始终保持不变.创建了另一个DataFrame,并为其分配了确切的行,但是一旦您执行该语句,它便变得不可访问,因为您没有任何指向它的变量.对于CPython的垃圾回收,有一些有用的信息here.

 

从@Bharath编辑:

(我的一位老师的解释)

T返回副本.这意味着分配了新的内存来存储新对象.如果您查看python垃圾回收,您会发现内存中的每个对象都会保留一个指向该对象的指针的计数器.

运行垃圾回收时,它将在内存中找到该对象,并看到它的指针为零.因为它的指针为零,所以垃圾回收将回收内存,并且该对象将永远消失.

因此,建议通过分配一个名称(或变量)来保持指向该对象的单个指针.

上一篇:VINS ---视觉约束的雅克比推导


下一篇:python-Numpy Performance-向量及其转置的外积